Cuda C – Erreur de l’éditeur de liens – référence non définie

J’ai de la difficulté à comstackr un simple programme cuda contenant seulement deux fichiers.

Le main.c ressemble à ceci:

#include "my_cuda.h" int main(int argc, char** argv){ dummy_gpu(); } 

Le cuda.h ressemble à ceci:

 #ifndef MY_DUMMY #define MY_DUMMY void dummy_gpu(); #endif 

Et le fichier my_cuda.cu se perd comme ceci:

 #include  #include "my_cuda.h" __global__ void dummy_gpu_kernel(){ //do something } void dummy_gpu(){ dummy_gpu_kernel<<>>(); } 

Cependant, si je comstack, je reçois toujours l’erreur suivante:

 gcc -I/usr/local/cuda/5.0.35/include/ -c main.c nvcc -c my_cuda.cu gcc -L/usr/local_rwth/sw/cuda/5.0.35/lib64 -lcuda -lcudart -o md.exe main.o my_cuda.o main.o: In function `main': main.c:(.text+0x15): undefined reference to `dummy_gpu' collect2: ld returned 1 exit status 

Merci de votre aide.

Vous avez un problème avec le nom du symbole. nvcc utilise le compilateur C ++ hôte pour comstackr le code hôte, ce qui implique que le nom du symbole est appliqué au code émis par la chaîne d’outils CUDA.

Il y a deux solutions pour ce problème. La première consiste à définir dummy_gpu aide de la liaison C, modifiez donc votre my_cuda.cu de la manière suivante:

 extern "C" { #include "my_cuda.h" } ..... extern "C" void dummy_gpu(){ dummy_gpu_kernel<<<128,128>>>(); } 

Notez que vous devrez modifier votre commande de liaison en ceci:

 gcc -L/usr/local_rwth/sw/cuda/5.0.35/lib64 -o md.exe main.o my_cuda.o -lcuda -lcudart 

parce que les bibliothèques partagées CUDA doivent être spécifiées après les fichiers objects qui les utilisent.

Votre deuxième alternative serait d’utiliser soit g++ soit nvcc pour faire la liaison, auquel cas le problème tout entier devrait disparaître.

Vous avez un problème de liaison C / C ++. nvcc décore des choses en C ++ mais votre compilateur gcc gère les choses en utilisant une liaison de style C. Un moyen simple de le réparer est de renommer votre fichier main.c en main.cpp, puis de répéter vos commandes en utilisant g ++ au lieu de gcc.