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.