nvcc:结合外部和常量

Rol*_*sen 5 linker cuda nvcc

我想将 CUDA 代码组织到单独的目标文件中,以便在编译结束时链接,就像在 C++ 中一样。为此,我希望能够__constant__在头文件中声明一个指向内存的外部指针,并将定义放入其中一个 .cu 文件中,同样遵循 C++ 的模式。但似乎当我这样做时,nvcc 会忽略“extern” - 它将每个声明作为定义。有没有解决的办法?

\n\n

为了更具体地了解代码和错误,我将其放在头文件中:

\n\n
extern __device__ void* device_function_table[];\n
Run Code Online (Sandbox Code Playgroud)\n\n

接下来是 .cu 文件中的内容:

\n\n
void* __device__ device_function_table[200];\n
Run Code Online (Sandbox Code Playgroud)\n\n

这在编译时给出了这个错误:

\n\n
(path).cu:40: error: redefinition of \xe2\x80\x98void* device_function_table [200]\xe2\x80\x99\n(path).hh:29: error: \xe2\x80\x98void* device_function_table [200]\xe2\x80\x99 previously declared here\n
Run Code Online (Sandbox Code Playgroud)\n\n

我当前的解决方案是使用 Makefile 魔法将我所有的 .cu 文件组合在一起,实际上拥有一个大的翻译单元,但有一些类似的文件组织。但这已经明显减慢了编译速度,因为对我的任何一个类的更改都意味着重新编译所有类;我预计还会增加几个课程。

\n\n

编辑:我看到我放入__constant__了文本和__device__示例中;这个问题对两者都适用。

\n

Tom*_*Tom 3

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

不允许使用__device__,__shared__和限定符:__constant__

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

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

__device__并且__constant__变量仅允许在文件范围内使用。

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