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

-1 cuda

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

Mar*_*o13 5

确实,“再”这个词有点令人困惑。我认为那里没有任何变化,Robert Crovella 从extern "C"技术意义上指出了 using 和 not在他的回答之间的主要区别。

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

使用 CUDA 驱动程序 API 时,可以手动加载“CUDA 模块”和“CUDA 功能”。现在想象一个包含内核的 .CU 文件,如下所示:

__global__ void exampleKernel(float** data) { ... }
Run Code Online (Sandbox Code Playgroud)

这可以使用 NVCC 进行编译,以生成 CUBIN(CUDA 二进制文件)或 PTX 文件。将此文件作为“CUDA模块”模块加载后,可以访问该功能(即CUDA内核):

cuModuleLoad(&cuModule, modulePath);
cuModuleGetFunction(&cuFunction, cuModule, "exampleKernel"); 
Run Code Online (Sandbox Code Playgroud)

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

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

extern "C" 
__global__ void exampleKernel(float** data) { ... }
Run Code Online (Sandbox Code Playgroud)

然后不会发生名称修改,并且可以使用以下命令访问该函数

cuModuleGetFunction(&cuFunction, cuModule, "exampleKernel"); 
Run Code Online (Sandbox Code Playgroud)

正如预期的那样。