【问题标题】:CUDA: How to link a specific obj, ptx, cubin from a separate compilation?CUDA:如何从单独的编译中链接特定的 obj、ptx、cubin?
【发布时间】:2019-01-17 03:01:46
【问题描述】:

我有一个相当大的 CUDA/C++ 项目,可以编译成静态库。工具链是 CUDA Toolkit 9.0/9.2 和 VS 2017。我无法更改公司工具链。我们最昂贵的内核受到 9.0 工具包中引入的 nvcc 编译器回归的影响。我已经向 Nvidia 开发者的网站提交了这个文件,并收到了回归的确认。那是大约一年前的事了,票还开着。也许 10.0 Toolkit 会修复它。

但我等不及了。所以我的计划是使用 8.0 nvcc 编译器和 v140 (VS 2015) 编译器来编译这个特定的内核。它是一个带有用于内核声明的 __device__ 装饰器的单个 .hpp 文件,以及一个带有定义的 .cu 文件。内核不调用其他内核;这是一个相当简单的内核。

从 v140 Native Tools 命令提示符,我执行了:

nvcc -x cu -arch=sm_61 -dc kernel.cu

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

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

【问题讨论】:

  • 静态库只是目标文件的集合。目标文件被添加到静态库中,而不是链接。在 Windows 上,您将使用库管理器 lib 来执行此操作。您可能会发现 thread on the NVIDIA forums 很有用,我通过一个工作示例演示了在 Linux 和 Windows 上处理静态库的过程。我不处理 GUI,所以不能告诉你如何在 VS 项目中使用 lib

标签: visual-studio cuda nvcc


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 2011-12-03
    • 2014-02-10
    • 2013-01-14
    • 2020-11-07
    • 2011-09-19
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多