Cuda C – Error del enlazador – referencia indefinida

Estoy teniendo dificultades para comstackr un progtwig simple de cuda con solo dos archivos.

El main.c se ve así:

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

La cuda.h se ve así:

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

Y el archivo my_cuda.cu pierde así:

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

Sin embargo, si compilo, siempre recibiré el siguiente error:

 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 

Gracias por tu ayuda.

Tienes un problema con el cambio de nombre del símbolo. nvcc utiliza el comstackdor de C ++ del host para comstackr el código de host, y esto implica que el mangle del nombre del símbolo se aplica al código emitido por la cadena de herramientas de CUDA.

Hay dos soluciones para este problema. El primero es definir dummy_gpu usando el enlace C, así que cambie my_cuda.cu a algo como esto:

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

Tenga en cuenta que deberá cambiar su comando de vinculación a esto:

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

porque las bibliotecas compartidas de CUDA deben especificarse después de los archivos de objeto que las utilizan.

Su segunda alternativa sería usar g++ o nvcc para hacer los enlaces, en cuyo caso el problema debería desaparecer.

Usted tiene un problema de vinculación C / C ++. nvcc está decorando cosas de forma C ++ pero su comstackdor gcc está manejando cosas usando el estilo C de vinculación. Una forma simple de arreglarlo es cambiar el nombre de tu main.c a main.cpp y luego repetir tus comandos usando g ++ en lugar de gcc