对于优秀的软件工程师,我想将代码放入不同的文件中, 就像在CPU上一样。在Cuda 5.0之前的Cuda中,这是不可能的,所有内容都必须放在一个主文件中。我刚开始使用Cuda 9,发现它描述了如何将文件保持在一个很好的结构https://devblogs.nvidia.com/separate-compilation-linking-cuda-device-code/
中我在nvcc编译器选项中添加了-dc
。
这应该激活单独的编译,因此我可以拥有一个不错的文件结构。
我在Developer Studio 2015(和Cuda 9)中。
添加-dc
后,我确实得到了错误:
main.cpp.obj:错误LNK2019:无法解析的外部符号 __cudaRegisterLinkedBinary_51_tmpxft_00005ad4_00000000_12_main_compute_70_cpp1_ii_loc 在函数“ void __cdecl中引用 __nv_cudaEntityRegisterCallback(void * *)”(?__ nv_cudaEntityRegisterCallback @@ YAXPEAPEAX @ Z)。
每个源文件(main.cu.obj,src1.cu.obj src2.cu.obj)都显示相同的错误。
a)我必须添加一个额外的库吗?
b)它的名字是什么?
c)LNK2019看起来像是Visual Studio链接器发出的警告-是否需要像cuda-linker这样的东西呢?
在Google搜索此错误消息时,我仅发现有人尝试将其代码放入lib中的情况。我只想运行一个简单的cuda编译。没有可向第三方出口的库。
编辑:我的错误是直接在命令行的“其他选项”中添加-dc。正确的方法是在Cuda / C ++-> Common中的Properties中。然后将“生成可重定位设备代码”更改为是(-rdc = true)。这可行。 即将。链接器警告已解决。
仍然有一个小贴士。 Cuda Samples中的simpleSeperateCompilation示例有效,但未达到预期效果。外部函数(multiplyByTwo)的访问方式很复杂:
// Static device pointers to __device__ functions.
__device__ deviceFunc dMultiplyByTwoPtr = multiplyByTwo;
__device__ deviceFunc dDivideByTwoPtr = divideByTwo;
随后是:
deviceFunc hFunctionPtr;
cudaMemcpyFromSymbol(&hFunctionPtr,
dMultiplyByTwoPtr,
sizeof(deviceFunc));
transformVector<<<dimGrid, dimBlock>>>
(dVector, hFunctionPtr, kVectorSize);
这可行,但是需要额外的功能和声明。
我一直在寻找一种简单的方法来从另一个文件中调用文件中的设备代码。现在,我的解决方法是像其他人一样做,将以前的.cpp和.h推入.cuh并将其包括在内。我想我可以忍受这个。我只是想确保这是在Cuda中构建项目的正确/最佳方法。