CUDA:如何从单独的编译中链接特定的obj,ptx,cubin?

时间:2018-08-09 15:11:31

标签: visual-studio cuda nvcc

我有一个相当大的CUDA / C ++项目,可以编译为静态库。该工具链是CUDA Toolkit 9.0 / 9.2和VS2017。我无法更改公司工具链。我们最昂贵的内核受到9.0 Toolkit中引入的nvcc编译器回归的打击。我已经在Nvidia开发人员的网站上提交了此文件,并收到了回归的确认。那是大约一年前的事了,车票仍然开放。也许10.0工具包会修复它。

但是我等不及了。因此,我的计划是使用8.0 nvcc编译器和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 Project中,大概是使用kernel.hpp和kernel.obj,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

根据上面的Njuffa的评论,最简单的解决方案是使用该内核的早期高性能工具链(VS 2015和CUDA 8.0 Tookit)创建一个静态库。然后使用后面的工具链将该库链接到更大的项目中。我这样做是成功的。

我在VS 2015中仅使用内核源代码和标头创建了CUDA 8.0模板项目。编译目标设置为静态库。这创建了一个.lib文件。然后,使用VS 2017和CUDA 9.0将.lib文件和标头添加到更大项目的C ++链接器设置中。使用此静态库的所有测试可执行文件都会通过。这比尝试使用中间编译格式(ptx,cubin等)进行重新编译要简单得多。

尽管最终,真正的解决方案是重构内核以更有效地使用共享内存,而无需使用较早的nvcc版本。