不同源文件

时间:2017-05-13 06:45:04

标签: pointers cuda global allocation

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

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

经过多次尝试失败后,我决定将所有需要此表的内核放在同一个源文件中,这样一切正常,直到我在main.cpp中分配我的表之前在main函数中添加了cudaMalloc。登记/> 这样我注意到表中的值和主要分配的数据是重叠的,并使用MS visual studio 2015的cuda调试工具,我发现2个分配的指针是相同的!

请建议如何在没有冲突的情况下在cuda中声明一个全局指针。

1 个答案:

答案 0 :(得分:0)

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

您有两种选择:

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