我有一个相当大的CUDA/C++项目,可以编译成静态库。工具链是CUDA Toolkit 9.0/9.2和VS 2017。我不能更改公司工具链。我们最昂贵的内核受到了9.0工具包中引入的nvcc编译器回归的打击。我已经向Nvidia开发人员的网站提交了这份文件,并收到了回归的确认。那是大约一年前的事了,而且门票还在开着。也许10.0工具包可以解决这个问题。
但我等不及了。所以我的计划是使用8.0NVCC编译器和v140 (VS 2015)编译器编译这个特定的内核。它是一个带有用于内核声明的__device__装饰器的单个.hpp文件,以及一个带有定义的.cu文件。内核不调用其他内核;它是一个相当简单的内核。
在v140本机工具命令提示符下,我执行了:
nvcc -x cu -arch=sm_61 -dc kernel.cu并获得了一个kernel.obj文件。我已经读过NVCC documentation on CUDA Compiler Driver NVCC了。我承认我并不完全理解。有几个编译阶段,我看不出哪一个是适合我的情况。
我的问题是如何将这个对象文件链接到我更大的静态库中?如果有人能给我指出正确的命令序列,或者更好的是,如何将其包含到VS项目中,大概是使用kernel.hpp和kernel.obj,我将不胜感激。
发布于 2018-08-27 16:27:13
根据Njuffa上面的评论,最简单的解决方案是使用该内核的早期性能工具链创建一个静态库(VS 2015 & CUDA 8.0 Tookit)。然后使用后面的工具链将该库链接到更大的项目中。我成功地做到了。
我在VS2015中创建了一个CUDA 8.0模板项目,只包含内核源和头文件。编译目标设置为静态库。这将创建一个.lib文件。然后,使用VS2017和CUDA9.0将.lib文件和头文件添加到更大项目的C++链接器设置中。使用这个静态库的所有测试可执行文件都通过了。与尝试使用中间编译格式( ptx、cubin等)重新编译相比,这是一个简单得多的解决方案。
尽管最终,真正的解决方案是重构内核以更有效地使用共享内存,从而消除了对较旧的nvcc版本的需求。
https://stackoverflow.com/questions/51770529
复制相似问题