我想将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__
;这个问题适用于两者。
答案 0 :(得分:4)
简而言之,使用最新的CUDA工具包(我在v8上)和计算能力至少为2.0,在Visual Studio中,转到项目属性 - > CUDA C / C ++ - >常见,查找"生成可重定位设备代码"在列表中,将其设置为"是(-rdc = true)"。
对于命令行this page建议–dc
编译器选项
答案 1 :(得分:3)
从CUDA C Programming Guide版本4.0,D.2.1.1节:
不允许使用
__device__
,__shared__
和__constant__
限定符 于:
- 类,结构和联合数据成员,
- 形式参数,
- 在主机上执行的函数中的局部变量。
__shared__
和__constant__
变量隐含了静态存储。
__device__
和__constant__
变量仅允许在文件范围内使用。
__device__
,__shared__
和__constant__
变量不能使用extern关键字定义为外部变量。唯一的例外是动态分配的__shared__
变量,如第B.2.3节所述。
答案 2 :(得分:3)
从CUDA 5.0开始,如果启用了单独的编译和链接,现在可以使用CUDA创建外部定义的数据。这篇博客文章解释了它:http://devblogs.nvidia.com/parallelforall/separate-compilation-linking-cuda-device-code/
如果这样做,就像在原帖中一样简单地使用它,并且“只是工作”。