不同源文件中的cuda全局指针分配

cuda global pointer allocation in different source file

我遇到这样一种情况,我需要将一些 table 填充到一个源文件中(例如 fill.cu),然后在不同的源文件中用于不同的内核。

我尝试在 fill.h 头文件中将指针 __device__ float *myTable; 声明为 'extern' 并将其添加到 others.cpp 并在 fill.cu 中定义该指针并分配并在那里填写。
这样,我得到链接器错误,表明 myTable 已经在 fill.cpp 中定义。

经过多次不成功的尝试,我决定将所有需要这个 table 的内核放在同一个源文件中,这样一切正常,直到我在分配我的 [ 之前在主函数中添加了一个 cudaMalloc =30=] 在 fill.cpp.
这样我注意到在main中分配的table值和数据重叠并且使用MS visual studio 2015的cuda调试工具,我发现2个分配的指针是相同的!

请教如何在cuda中声明一个全局指针而不冲突

传统的CUDA联动模型要求所有的设备符号、纹理、函数等都在同一个翻译单元的范围内定义和使用。听起来你的代码结构违反了这个要求。

你有两个选择:

  1. 继续相同的代码结构,但提供包装函数,您的 main 可以调用这些函数来对静态声明的设备变量执行操作,而不是直接使用来自其他代码的 CUDA API 操作设备符号。
  2. 使用separate compilation。在这里,您只在一个文件中定义了您想要访问的设备符号,并在您需要使用该符号的任何其他地方声明了与 extern 相同的符号。您必须明确使用多个 nvcc 选项来编译您的设备代码并使用单独的设备代码链接阶段。

这两种方法都有详细的记录。