我想将我的 CUDA 代码组织成单独的目标文件,以便在编译结束时链接,就像在 C++ 中一样。为此,我希望能够__constant__
在头文件中声明一个指向内存的外部指针,并将定义放在 .cu 文件之一中,也遵循 C++ 的模式。但似乎当我这样做时,nvcc 忽略了“外部”——它将每个声明都作为定义。有没有解决的办法?
为了更具体地了解代码和错误,我在头文件中有这个:
extern __device__ void* device_function_table[];
紧随其后的是 .cu 文件:
void* __device__ device_function_table[200];
这在编译时给出了这个错误:
(path).cu:40: error: redefinition of ‘void* device_function_table [200]’
(path).hh:29: error: ‘void* device_function_table [200]’ previously declared here
我目前的解决方案是使用 Makefile 魔法将我所有的 .cu 文件组合在一起,实际上拥有一个大的翻译单元,但有一些文件组织的外观。但这已经明显减慢了编译速度,因为对我的任何一个类的更改都意味着重新编译所有类;我预计会增加更多的课程。
编辑:我看到我__constant__
在文本和__device__
示例中输入了;这个问题适用于两者。