c++ - 从常规 C++ 代码调用 CUDA 代码——整理出 extern "C"

标签 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融合的方法有什么问题?

最佳答案

您已将 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/

相关文章:

c++ - 如何从成对的初始化列表构造对象?

c++ - 如何使用 CUDA 生成随机排列

c++ - 如何在 Cuda 设备函数中使用 C++11 中的闭包参数声明函数?

cuda - 未找到 nvprof 应用程序

sql-server - 从 MS SQL 数据库获取数据到 Lotus Notes 数据库

C++ HTML 生成类

c++ - Win32 C++ 调整控件大小

iPhone 应用程序中来自 SpeakHere 的 C++

c++ - 重载运算符的顺序

iphone - 如何使用 twitter 设置我的 iphone 应用程序?