首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUDA:如何从单独的编译中链接特定的obj,ptx,cubin?

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

Stack Overflow用户
提问于 2018-08-09 23:11:31
回答 1查看 577关注 0票数 1

我有一个相当大的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本机工具命令提示符下,我执行了:

代码语言:javascript
复制
nvcc -x cu -arch=sm_61 -dc kernel.cu

并获得了一个kernel.obj文件。我已经读过NVCC documentation on CUDA Compiler Driver NVCC了。我承认我并不完全理解。有几个编译阶段,我看不出哪一个是适合我的情况。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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版本的需求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51770529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档