【问题标题】:How to check what CUDA compute compatibility is the library compiled with?如何检查编译库的 CUDA 计算兼容性?
【发布时间】:2017-02-20 06:35:11
【问题描述】:

我在 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;

它运行正常。

【问题讨论】:

  • CUDA binary utilities 可以提供帮助。您可以找出编译库中包含哪些 PTX 和 SASS 版本。也不清楚您是否了解有关 PTX、SASS 的一般概念,以及与特定 GPU 的兼容性意味着什么。许多 SO 问题以及 nvcc documentation 都涵盖了该主题。
  • @RobertCrovella 我尝试了 cuobjdump,但是当我用 3.0 和 3.5 编译代码时,cuobjdump 显示两者,所以一旦执行此代码,我仍然不清楚它将在哪个架构上运行。如果你能指出我回答了哪些 SO 问题,我会很乐意删除这篇文章。谢谢!
  • 我很惊讶 sm_20 代码在 sm_35 机器上失败。我已经在 sm_35 机器上运行了相当大的 sm_20 代码,没有任何问题,尽管这样做效率不高。
  • 您的问题(至少是标题)是如何找出编译库时使用的计算能力。我认为 cuobjdump 会告诉你。 CUDA 运行时将选择: 1. 与架构精确匹配的 SASS(如果存在)。 2. 架构的兼容 SASS 匹配(如果存在)。 2. 小于或等于设备计算能力的最高可用 PTX,JIT 编译为适当的 SASS。
  • 在 sm35 设备上运行 sm20 代码的唯一方法是 PTX 是否可用。问题中选择的特定编译器开关会产生 SASS 但不会产生 PTX。对于 sm20,这在 sm35 设备上会失败,而且一直都是这样。如果您可以在 sm35 设备上运行“sm20 代码”,则意味着您已包含 PTX。

标签: c++ cuda


【解决方案1】:

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

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

如何发现特定库已针对哪些架构(PTX、SASS)进行编译?

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

如果一个库包含多个架构,我怎么知道在设备上实际执行什么。

在应用程序启动时,CUDA 运行时检查应用程序的二进制对象,粗略地说,将使用以下启发式方法来确定将在 GPU 上运行的内容:

  1. 如果二进制对象中存在完全匹配的 SASS,则运行时会将其用于 GPU。这意味着,例如,如果您的对象(可执行文件或库)包含 sm_35 SASS 代码的条目,并且您在 sm_35(即计算能力 3.5)GPU 上运行,那么 CUDA 运行时将选择它。

  2. 如果不满足第 1 项,CUDA 运行时接下来会选择一个“兼容”的 SASS 条目(如果存在)。这不是很好定义/指定的 AFAIK,但通常 sm30 SASS 对象应该可以在任何 sm_3x 设备上使用,同样适用于 sm_2x 设备上的 sm20 SASS 或任何 sm_5x 设备上的 sm50 SASS。对于其他问题(例如 sm32 SASS 是否可以直接在 sm35 设备上使用),我没有指定兼容性的完整表格。可以使用问题中公开的方法来测试特定情况:构建仅包含特定 SASS 类型的对象,并查看它是否会在预期的 GPU 上运行。

  3. 如果不满足第 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 项目使用的策略。

【讨论】:

  • 可能会特别提到cuobjdump--dump-sass--dump-ptx 命令行开关。
  • 好的,完成。希望人们也会阅读链接的文档。
  • 我从来没有意识到这些开关有简短的形式(-sass-ptx)! :-)
  • 这大致就是我们互动的本质。你教我很多宏大的编程概念,我教你命令行快捷键。 :-)
猜你喜欢
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2020-01-21
  • 2022-11-20
  • 2021-10-09
  • 2011-08-28
相关资源
最近更新 更多