【发布时间】:2011-10-31 20:11:07
【问题描述】:
我想将我的 CUDA 代码组织成单独的目标文件,以便在编译结束时链接,就像在 C++ 中一样。为此,我希望能够在头文件中声明指向__constant__ 内存的外部指针,并将定义放入其中一个 .cu 文件中,也遵循 C++ 的模式。但似乎当我这样做时,nvcc 忽略了“extern”——它将每个声明作为一个定义。有没有办法解决这个问题?
为了更具体地说明代码和错误,我在头文件中有这个:
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__;这个问题适用于两者。
【问题讨论】:
-
CUDA 不支持单独编译,所以我不希望 nvcc 以任何合理的方式处理
extern __device__。