是extern" C"在cuda不再需要了?

时间:2015-01-03 15:03:43

标签: cuda

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

2 个答案:

答案 0 :(得分:2)

事实上,“再”这个词有点令人困惑。我认为那里没有任何改变,Robert Crovella在技术意义上指出了在他的答案中使用而不是extern "C"之间的主要区别。

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

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

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

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

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

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

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

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

然后没有名称重整,并且可以使用

访问该功能
cuModuleGetFunction(&cuFunction, cuModule, "exampleKernel"); 

正如所料。

答案 1 :(得分:1)

是的,默认情况下,nvcc采用c ++链接样式。我不确定你的意思是“再”了。我认为这种方式已经很久了。

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

extern "C" {}

构造表示C风格的外部链接。