我正在尝试从单独编译的 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融合的方法有什么问题?
最佳答案
您已将 cuda_function()
声明为 extern "C"
,但随后使用 C++ 对其进行了定义。从您的声明中删除 extern "C"
,它将起作用。
或者,您可以将相同的声明添加到 cuda.cu 文件中,但毫无意义。
详细一点,nvcc 是一个包装器,它将文件拆分为主机代码和设备代码,然后分别调用主机编译器和设备编译器。回到过去的 CUDA 编程时代,nvcc 在“C”模式下调用主机编译器,这意味着您需要在从 C++ 调用时将 extern "C"
放在声明中。回到现在,nvcc 默认为主机代码使用 C++,这意味着您不应该再需要这些外部函数(当然,除非您的主机代码的其余部分是 C 语言)。
关于c++ - 从常规 C++ 代码调用 CUDA 代码——整理出 extern "C",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4099657/