cudaMemcpyToSymbol utilisant ou non une chaîne

J’essayais de copier une structure dans la mémoire constante de cette manière:

struct Foo { int a, b, c; }; __constant__ Foo cData; int main() { Foo hData = {1, 2, 3}; cudaMemcpyToSymbol(cData, &hData, sizeof(Foo)); // ... } 

Et cela fonctionnait bien, dans mon kernel, je pouvais accéder directement aux données constantes:

 __global__ void kernel() { printf("Data is: %d %d %d\n", cData.a, cData.b, cData.c); // 1 2 3 } 

Mais ensuite, j’ai essayé d’utiliser un caractère const char * comme nom de symbole et les choses ont cessé de fonctionner:

 cudaMemcpyToSymbol("cData", &hData, sizeof(Foo)); // prints 0 0 0 

Je pensais que les deux versions étaient similaires, mais il me semblait que j’avais tort.

Qu’est-ce qui se passe?

EDIT: J’aimerais signaler le même comportement avec cudaGetSymbolAddress, qui fonctionne pour moi si aucun caractère const char * n’est utilisé:

 __constant__ int someData[10]; __constant__ int *ptrToData; int *dataPosition; cudaGetSymbolAddress((void **)&dataPosition, someData); // Works // cudaGetSymbolAddress((void **)&dataPosition, "someData"); // Do not work cudaMemcpyToSymbol(ptrToData, &dataPosition, sizeof(int *)); 

A partir de CUDA 5, l’utilisation d’une chaîne pour les noms de symbole n’est plus prise en charge. Ceci est couvert dans les notes de publication de CUDA 5 ici

• L’utilisation d’une chaîne de caractères pour indiquer un symbole de périphérique, qui était possible avec certaines fonctions de l’API, n’est plus prise en charge. Au lieu de cela, le symbole doit être utilisé directement.

L’une des raisons de cela est liée à l’activation d’un véritable éditeur de liens de périphériques, qui est une nouvelle fonctionnalité de CUDA 5.

En raison de la répétition de la même erreur, je souhaite partager cet exemple de code qui présente presque tous les exemples de cas associés à ce problème (je peux donc faire référence ici plus tard lorsque je commettrai les mêmes erreurs).

 //file: main.cu #include  #include  #include  __constant__ float constData[256]; __device__ float devData; __device__ float* devPointer; int main(int argc, char **argv) { cudaFree(0); float data[256]; cudaError_t err = cudaMemcpyToSymbol(constData, data, sizeof(data)); printf("Err id: %d, str: %s\n", err, cudaGetErrorSsortingng(err)); float value = 3.14f; err = cudaMemcpyToSymbol(devData, &value, sizeof(float)); printf("Err id: %d, str: %s\n", err, cudaGetErrorSsortingng(err)); float* ptr; cudaMalloc(&ptr, 256 * sizeof(float)); err = cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr)); printf("Err id: %d, str: %s\n", err, cudaGetErrorSsortingng(err)); cudaFree(ptr); return EXIT_SUCCESS; } 

Je devenais “symbole de périphérique non valide” et beaucoup d’autres qui sont liés à _ constante _ _ utilisation de la mémoire _ périphérique _ . Ce code ne donne pas de telles erreurs au moment de l’exécution.