cuda 不再需要 extern "C" 了吗?

Is extern "C" no longer needed anymore in cuda?

我从某人那里听说 nvcc 默认为主机代码使用 C++,因此不再需要 extern "C",除非主机代码的其余部分在 C 中,是这样吗?

是的,nvcc 默认采用 c++ 链接样式。我不确定 "anymore" 是什么意思。我想这样已经很久了。

与任何其他 C/C++ 代码组合一样,您可以使用

extern "C" {}

构造以指示 C 样式的外部链接。

的确,"anymore"这个词有点让人迷惑。我不认为那里有任何改变,Robert Crovella 在技术意义上的回答中指出了使用和不使用 extern "C" 之间的主要区别。

但是,我想指出对 CUDA 内核使用 extern "C" 所隐含的一个重要区别,这可能是造成混淆的原因之一:

使用 CUDA 驱动程序 API 时,可以手动加载 "CUDA module" 和 "CUDA function"。现在想象一个包含这样内核的 .CU 文件:

__global__ void exampleKernel(float** data) { ... }

这可以用 NVCC 编译,生成 CUBIN(CUDA 二进制文件)或 PTX 文件。将此文件作为 "CUDA module" 模块加载后,可以访问函数(即 CUDA 内核):

cuModuleLoad(&cuModule, modulePath);
cuModuleGetFunction(&cuFunction, cuModule, "exampleKernel"); 

第二次调用很可能不会成功:内核名称 exampleKernel 很可能会 mangled,因为它被视为 C++ 函数 (见 Name mangling)。

当内核声明为extern "C"时,如本例:

extern "C" 
__global__ void exampleKernel(float** data) { ... }

然后 没有 名称重整发生,可以使用

访问函数
cuModuleGetFunction(&cuFunction, cuModule, "exampleKernel"); 

符合预期。