Sto lavorando a un'app di crunch numerico utilizzando il framework CUDA. Ho alcuni dati statici che devono essere accessibili a tutte le discussioni, così ho messo in memoria costante simili:Come utilizzare la memoria costante CUDA in un programmatore in modo piacevole?
__device__ __constant__ CaseParams deviceCaseParams;
uso il cudaMemcpyToSymbol chiamata per trasferire questi params dall'host al dispositivo:
void copyMetaData(CaseParams* caseParams)
{
cudaMemcpyToSymbol("deviceCaseParams", caseParams, sizeof(CaseParams));
}
che funziona.
Ad ogni modo, sembra (per tentativi ed errori, e anche dalla lettura di messaggi in rete) che per qualche motivo insoddisfacente, la dichiarazione di deviceCaseParams e l'operazione di copia di esso (la chiamata a cudaMemcpyToSymbol) devono essere nello stesso file. Al momento ho questi due in un file .cu, ma voglio davvero avere il parametro struct in un file .cuh in modo che qualsiasi implementazione possa vederlo se lo desidera. Ciò significa che devo anche avere la funzione copyMetaData nel file di intestazione, ma questo mette a bada il collegamento (simbolo già definito) poiché entrambi i file .cpp e .cu includono questa intestazione (e quindi sia il compilatore MS C++ che nvcc lo compila).
Qualcuno ha qualche consiglio sul design qui?
Aggiornamento: Vedere i commenti
Sei sicuro che devono essere nello stesso file e non semplicemente nella stessa unità di traduzione? (Ad esempio, la dichiarazione potrebbe essere nel file di intestazione, che viene quindi incluso #incluso nel file sorgente). –
L'ho provato per un paio di minuti fa e sembra che tu abbia ragione. Non capisco cosa è andato storto quando ho provato quell'ultima volta però. Funziona adesso di sicuro. Grazie. –