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

Visual studio CUDA:如何从单独的编译中链接特定的obj、ptx、cubin?,visual-studio,cuda,nvcc,Visual Studio,Cuda,Nvcc,我有一个相当大的CUDA/C++项目,可以编译成一个静态库。工具链是CUDA Toolkit 9.0/9.2和VS 2017。我不能改变公司的工具链。我们最昂贵的内核受到了9.0工具包中引入的nvcc编译器回归的影响。我已经向英伟达开发者网站提交了这篇文章,并得到了回归的确认。那是大约一年前的事了,现在票还开着。也许10.0工具包可以解决这个问题 但我等不及了。所以我的计划是使用8.0NVCC编译器和v140(VS2015)编译器编译这个特定的内核。它是一个单独的.hpp文件,内核声明使用_de

我有一个相当大的CUDA/C++项目,可以编译成一个静态库。工具链是CUDA Toolkit 9.0/9.2和VS 2017。我不能改变公司的工具链。我们最昂贵的内核受到了9.0工具包中引入的nvcc编译器回归的影响。我已经向英伟达开发者网站提交了这篇文章,并得到了回归的确认。那是大约一年前的事了,现在票还开着。也许10.0工具包可以解决这个问题

但我等不及了。所以我的计划是使用8.0NVCC编译器和v140(VS2015)编译器编译这个特定的内核。它是一个单独的.hpp文件,内核声明使用_device _; decorator,定义为.cu文件。内核不调用其他内核;它是一个相当简单的内核

在v140本机工具命令提示符下,我执行了:

nvcc -x cu -arch=sm_61 -dc kernel.cu
并获得一个kernel.obj文件。我读过这本书。我承认我并不完全理解。有几个编译阶段,我看不出哪一个是适合我的案例的正确路线


我的问题是如何将这个对象文件链接到我的更大的静态库中?如果有人能告诉我正确的命令系列,或者更好的是,如何将其包含到VS项目中,大概是使用kernel.hpp和kernel.obj,我将不胜感激。

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

我在VS 2015中创建了一个CUDA 8模板项目,只包含内核源和头。编译目标设置为静态库。这创建了.LIB文件。然后,使用VS 2017和CUDA 9将.LIB文件和头添加到更大项目的C++链接器设置中。所有使用该静态库的测试可执行文件都通过。比尝试使用中间编译格式(ptx、cubin等)重新编译要简单得多的解决方案


尽管最终,真正的解决方案是重构内核以更有效地使用共享内存,从而消除对旧版nvcc的需求。

静态库只是对象文件的集合。对象文件被添加到静态库中,而不是链接。在Windows上,您可以使用库管理器
lib
来实现这一点。您可以我找到了一个有用的例子,在这里我用一个工作过的例子演示了在Linux和Windows上处理静态库。我不处理GUI,因此无法告诉您如何使用VS项目中的
lib