nvcc:结合extern和constant

时间:2011-10-31 20:11:08

标签: linker cuda nvcc

我想将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__;这个问题适用于两者。

3 个答案:

答案 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/

如果这样做,就像在原帖中一样简单地使用它,并且“只是工作”。