5

我想将我的 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__示例中输入了;这个问题适用于两者。

4

3 回答 3

4

长话短说,使用最新的 CUDA 工具包(我在 v8 上)和至少 2.0 的计算能力,在 Visual Studio 中,转到 Project Properties -> CUDA C/C++ -> Common ,在列表,将其设置为“是(-rdc=true)”。

对于命令行,此页面建议–dc编译器选项

于 2016-10-02T06:50:29.943 回答
3

CUDA C 编程指南4.0 版,第 D.2.1.1 节:

和限定符不允许用于__device____shared____constant__

  • 类、结构和联合数据成员,
  • 形式参数,
  • 在主机上执行的函数中的局部变量。

__shared____constant__变量具有隐含的静态存储。

__device____constant__变量只允许在文件范围内。

__device__,__shared__并且__constant__不能使用 extern 关键字将变量定义为外部变量。唯一的例外是动态分配的__shared__变量,如第 B.2.3 节所述。

于 2011-11-01T14:01:09.043 回答
3

从 CUDA 5.0 开始,如果启用了单独的编译和链接,现在可以使用 CUDA 获得外部定义的数据。这篇博文对此进行了解释:http ://devblogs.nvidia.com/parallelforall/separate-compilation-linking-cuda-device-code/

如果这样做了,人们只需像在原始帖子中一样使用它,它“就可以工作”。

于 2015-10-20T11:29:13.273 回答