从常规C ++代码调用CUDA代码 - 整理extern“C”

时间:2010-11-04 17:55:30

标签: c++ cuda integration compatibility

我试图从C ++文件调用CUDA(主机)函数,单独编译:

sample.cpp C ++文件:

extern "C" void cuda_function(int a, int b);
int main(){
  //statements
  cuda_function(23, 34);
  //statements
}

cuda.cu档案:

#include <cuda.h>
__global__ void kernel(int a, int b)
{
  //statements
}
void cuda_function(int a, int b){
  //cuda_function
}

构建命令:

g++ -c sample.cpp
nvcc -c cuda.cu
nvcc -o sample sample.o cuda.o

但是这会给链接器错误:

sample.o: In function `main':
sample.cpp:(.text+0x163): undefined reference to `cuda_function'
collect2: ld returned 1 exit status

这种C ++和CUDA集成方法有什么问题?

1 个答案:

答案 0 :(得分:11)

您已将cuda_function()声明为extern "C",但随后使用C ++对其进行了定义。从您的退出中删除extern "C",它将起作用。

或者,但毫无意义,您可以将相同的声明添加到cuda.cu文件中。

详细说明一下,nvcc是一个包装器,它将文件分成主机代码和设备代码,然后分别调用主机编译器和设备编译器。回到CUDA编程的旧时代,nvcc在“C”模式下调用主机编译器,这意味着在从C ++调用时需要将extern "C"放在decarations上。回到现在,nvcc默认使用C ++作为主机代码,这意味着您不再需要这些外部代码(除非主机代码的其余部分在C中)。