14

我很难编译一个只有两个文件的简单 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

谢谢您的帮助。

4

2 回答 2

26

你有符号名称修改的问题。nvcc使用主机 C++ 编译器来编译主机代码,这意味着符号名称修改应用于 CUDA 工具链发出的代码。

这个问题有两种解决方案。第一个是dummy_gpu使用 C 链接定义,因此将您的更改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进行链接,在这种情况下,整个问题应该消失。

于 2012-11-25T16:42:02.937 回答
8

您有 C/C++ 链接问题。nvcc 正在以 C++ 方式装饰事物,但您的 gcc 编译器正在使用 C 样式链接处理事物。一个简单的修复方法是将你的 main.c 重命名为 main.cpp,然后使用 g++ 而不是 gcc 重复你的命令

于 2012-11-25T16:44:55.433 回答