Je travaille sur une application crunching en utilisant le framework CUDA. J'ai des données statiques qui doivent être accessibles à tous les threads, donc je l'ai mis en mémoire constante comme ceci:Comment utiliser la mémoire constante CUDA dans un programmeur de manière agréable?
__device__ __constant__ CaseParams deviceCaseParams;
J'utilise le cudaMemcpyToSymbol d'appel pour transférer ces params de l'hôte vers l'appareil:
void copyMetaData(CaseParams* caseParams)
{
cudaMemcpyToSymbol("deviceCaseParams", caseParams, sizeof(CaseParams));
}
qui fonctionne.
De toute façon, il semble (par essais et erreurs, et aussi de la lecture des messages sur le net) que pour une raison quelconque, la déclaration de deviceCaseParams et l'opération de copie (l'appel à cudaMemcpyToSymbol) doit être dans le même fichier. Pour le moment j'ai ces deux dans un fichier .cu, mais je veux vraiment avoir le paramètre struct dans un fichier .cuh afin que toute implémentation puisse le voir si elle le veut. Cela signifie que je dois aussi avoir la fonction copyMetaData dans un fichier d'en-tête, mais cela perturbe le lien (symbole déjà défini) puisque les deux fichiers .cpp et .cu incluent cet entête (et donc le compilateur MS C++ et nvcc le compile).
Quelqu'un a-t-il des conseils sur la conception ici?
Mise à jour: Voir les commentaires
Etes-vous sûr qu'ils doivent être dans le même fichier, et pas simplement dans la même unité de traduction? (c'est-à-dire que la déclaration pourrait se trouver dans le fichier d'en-tête, qui est alors inclus dans le fichier source). –
J'ai essayé cela pour quelques minutes et il semble que vous avez raison. Je ne comprends pas ce qui a mal tourné quand j'ai essayé cela la dernière fois cependant. Cela fonctionne maintenant à coup sûr. Merci. –