-1 cuda
我从某人那里听说 nvcc 默认为 C++ 用于主机代码,因此不再需要 extern "C",除非主机代码的其余部分是 C,这是真的吗?
确实,“再”这个词有点令人困惑。我认为那里没有任何变化,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)
正如预期的那样。
归档时间: |
|
查看次数: |
2969 次 |
最近记录: |