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");
符合预期。
我从某人那里听说 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");
符合预期。