【发布时间】: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。