我从某人那里听说nvcc默认使用C ++作为主机代码,所以extern" C"不再需要了,除非主机代码的其余部分在C中,是真的吗?
答案 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风格的外部链接。