gpt4 book ai didi

c++ - 如何检查编译库的 CUDA 计算兼容性?

转载 作者:行者123 更新时间:2023-11-27 22:48:49 26 4
gpt4 key购买 nike

我在 Ubuntu 16.04 上。假设给了我一个随机的 libtestcuda.so 文件,无论如何我可以检查编译库的 CUDA 计算兼容性吗?

我努力了

ll libtestcuda.so

它没有显示太多。

我想知道这一点,因为如果我用
-gencode arch=compute_30,code=sm_30;

它在我编写的一个小型 cuda 程序上编译并运行良好,但是当我在我的 GPU 上运行 deviceQuery 时,它实际上显示了 CUDA 计算兼容性 3.5,所以我很想知道这段代码是否会在 3.0 或 3.5 架构中执行。

如果我编译并运行它
-gencode arch=compute_20,code=sm_20;

或者
-gencode arch=compute_50,code=sm_50;

它按预期失败。

如果我编译并运行它
-gencode arch=compute_35,code=sm_35;

它按预期运行良好。

最佳答案

关于使用标志的一般背景告诉 nvcc为哪些架构编译,我建议this questionthis question ,以及 nvcc documentation .

在评论中讨论之后,似乎有两个问题。 (尽管这些问题有库,但大多数评论同样适用于可执行对象。)

How can I discover which architectures (PTX, SASS) a particular library has been compiled for?



这可以使用 CUDA binary utilities 发现。例如 cuobjdump .特别是 -ptx开关将列出所有包含的 PTX 对象,以及 -sass switch 将列出所有包含的 SASS 对象。为 sm_30 的“真实架构”编译的库例如将包含 sm_30 SASS 代码,这在 cuobjdump 中很明显输出。为“虚拟架构”编译的库 compute_50例如将包含 compute_50 PTX 代码,这在 cuobjdump 中很明显输出。请注意,一个库(或任何 CUDA fatbin 对象)可能包含多个架构的代码,包括 PTX 和 SASS,或多个 SASS 版本。

If a library contains multiple architectures, how do I know what will actually execute on the device.



在应用程序启动时,CUDA 运行时检查应用程序的二进制对象,粗略地说,将使用以下启发式方法来确定将在 GPU 上运行的内容:
  • 如果二进制对象中存在精确的 SASS 匹配,则运行时会将其用于 GPU。这意味着例如,如果您的对象(可执行文件或库)包含 sm_35 SASS 代码的条目,并且您在 sm_35(即计算能力 3.5)GPU 上运行,那么 CUDA 运行时将选择它。
  • 如果不满足第 1 项,则 CUDA 运行时接下来将选择一个“兼容的”SASS 条目(如果存在)。这不是很好定义/指定的 AFAIK,但通常 sm30 SASS 对象应该可以在任何 sm_3x 设备上使用,同样适用于 sm_2x 设备上的 sm20 SASS 或任何 sm_5x 设备上的 sm50 SASS。对于其他问题(例如 sm32 SASS 是否可以直接在 sm35 设备上使用),我没有指定兼容性的完整表格。可以使用问题中公开的方法测试特定情况:构建仅包含特定 SASS 类型的对象,并查看它是否会在预期的 GPU 上运行。
  • 如果不满足第 1 项和第 2 项,CUDA 运行时将搜索兼容的 PTX 条目。对于给定 GPU 类型的计算能力 x.y,兼容的 PTX 条目被定义为架构 z.w 的 PTX,其中 z.w 小于或等于 x.y。例如,cc2.0 PTX 与 cc3.5 设备兼容。 cc5.0 PTX 与 cc3.5 设备不兼容。一旦找到符合此标准的编号最高的 PTX 条目,GPU 驱动程序将对其进行 JIT 编译,以在运行时即时生成必要的 SASS 对象。

  • 如果第 1、2 或 3 项均不满足,GPU 代码将在任何和所有对 CUDA 运行时库的调用中返回运行时错误(NO BINARY FOR GPU,或类似的)。

    我已经忽略了一些与“真实”和“虚拟”架构相关的概念。这是一个复杂的话题,我建议阅读上面链接的 nvcc 文档作为背景。例如,任何给定的计算能力都具有可用于真实 (SASS) 和虚拟 (PTX) 的相同数值架构是不正确的。例如,对于 cc 2.0,真实 (sm_20) 和虚拟 (compute_20) 架构都存在。以cc2.1为例,只有真实架构(sm_21)存在,虚拟架构(compute_21)不存在,应该指定compute_20架构。例如,如果您尝试为 compute_21 编译,这将很明显。

    有人可能还会问“鉴于所有这些”,我应该为什么架构编译?

    这个问题已经在许多以前的 SO 问题上得到了回答,并且在某种程度上是一个见仁见智的问题。作为一个有用的引用点,我建议遵循 CUDA sample codes 项目使用的策略。 .

    关于c++ - 如何检查编译库的 CUDA 计算兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39981981/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com