我很难编写一个仅包含两个文件的简单cuda程序。
main.c看起来像这样:
#include "my_cuda.h"
int main(int argc, char** argv){
dummy_gpu();
}
cuda.h看起来像这样:
#ifndef MY_DUMMY
#define MY_DUMMY
void dummy_gpu();
#endif
my_cuda.cu文件就像这样:
#include <cuda_runtime.h>
#include "my_cuda.h"
__global__ void dummy_gpu_kernel(){
//do something
}
void dummy_gpu(){
dummy_gpu_kernel<<<128,128>>>();
}
但是如果我编译我总是收到以下错误:
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
感谢您的帮助。
答案 0 :(得分:20)
您遇到符号名称错误问题。 nvcc
使用主机C ++编译器来编译主机代码,这意味着符号name mangling应用于CUDA工具链发出的代码。
这个问题有两个解决方案。第一个是使用C链接定义dummy_gpu
,因此将my_cuda.cu
更改为以下内容:
extern "C" {
#include "my_cuda.h"
}
.....
extern "C"
void dummy_gpu(){
dummy_gpu_kernel<<<128,128>>>();
}
请注意,您需要将链接命令更改为:
gcc -L/usr/local_rwth/sw/cuda/5.0.35/lib64 -o md.exe main.o my_cuda.o -lcuda -lcudart
因为需要在使用它们的目标文件之后指定CUDA共享库。
您的第二种选择是使用g++
或nvcc
进行链接,在这种情况下,整个问题应该会消失。
答案 1 :(得分:5)
您有C / C ++链接问题。 nvcc正在以C ++方式装饰东西,但你的gcc编译器正在使用C风格链接来处理事物。解决它的一个简单方法是将main.c重命名为main.cpp,然后使用g ++而不是gcc重复命令