Linker nvcc:结合外部和常量 我想把我的CUDA代码组织成单独的对象文件,以便在编译结束时链接,就像C++一样。为此,我希望能够在一个头文件中声明一个外部代码,指向“代码”>“y-康斯坦特”内存,并将定义放在Cu文件之一中,也遵循C++的模式。但当我这样做时,nvcc似乎忽略了“extern”——它将每个声明作为一个定义。有办法解决这个问题吗

Linker nvcc:结合外部和常量 我想把我的CUDA代码组织成单独的对象文件,以便在编译结束时链接,就像C++一样。为此,我希望能够在一个头文件中声明一个外部代码,指向“代码”>“y-康斯坦特”内存,并将定义放在Cu文件之一中,也遵循C++的模式。但当我这样做时,nvcc似乎忽略了“extern”——它将每个声明作为一个定义。有办法解决这个问题吗,linker,cuda,nvcc,Linker,Cuda,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* d

为了更具体地说明代码和错误,我在头文件中有以下内容:

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 magic将我所有的.cu文件整合在一起,实际上有一个大的翻译单元,但有一些文件组织的外观。但这已经明显减慢了编译速度,因为对我的任何一个类的更改都意味着重新编译所有类;我预计还会增加几个类

编辑:我看到我把
\uuuu常量\uuuu
放在文本中,把
\uu设备\uuuu
放在示例中;这两个问题都适用

来自版本4.0第D.2.1.1节:

不允许使用
\uuuuuu设备\uuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
关于:

  • 类、结构和联合数据成员
  • 形式参数
  • 在主机上执行的函数中的局部变量
\uuuuuuuuuuuuuuuuuuuu共享
\uuuuuuuuu常量
变量具有隐含的静态存储

\uuuuuuu设备
\uuuuu常量
变量仅允许在文件范围内使用

不能使用extern关键字将
\uuuuuuuuu设备
\uuuuuu共享
\uuuuuuuuuu常量
变量定义为外部变量。唯一的例外是第B.2.3节中所述的动态分配的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


自CUDA 5.0以来,如果启用了单独的编译和链接,现在可以使用CUDA拥有外部定义的数据。这篇博文解释了这一点:


如果做到了这一点,你只需像在原始帖子中那样使用它,它就“起作用了”。

简而言之,使用最新的CUDA工具包(我在v8上)和至少2.0的计算能力,在Visual Studio中,转到Project Properties->CUDA C/C++->Common,在列表中找到“生成可重新定位的设备代码”,将其设置为“是(-rdc=true)”


因为命令行建议
–dc
编译器选项

CUDA不支持单独编译,所以我不希望nvcc以任何合理的方式处理
外部设备。
。谢谢,这回答了我的问题,即使这意味着我不能做我想做的事情。@RolfAndreassen,你现在可以了。请参阅下面的我的答案。@Tom也许是时候更新你的答案,以便包含单独的编译了?