我遇到一种情况,我需要在一个源文件中填充一些表(例如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中声明一个全局指针。
答案 0 :(得分:0)
传统的CUDA链接模型要求在同一翻译单元的范围内定义和使用所有设备符号,纹理,函数等。听起来你的代码结构违反了这个要求。
您有两种选择:
extern
相同的符号。您必须明确使用多个nvcc选项来编译设备代码并使用单独的设备代码链接阶段。这两种方法都有很好的记录。