首页 文章

如何检查CUDA计算兼容性是编译的库?

提问于
浏览
0

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

它按预期运行良好 .

1 回答

  • 3

    有关使用标志告诉 nvcc 要编译哪些体系结构的一般背景,我建议使用this questionthis question,以及nvcc documentation .

    在评论中讨论后,似乎有两个问题 . (虽然这些问题有可见的库,但大多数注释同样适用于可执行对象 . )

    我如何发现为特定库编译的架构(PTX,SASS)?

    这可以使用CUDA binary utilities发现,例如 cuobjdump . 特别是, -ptx 开关将列出包含的所有PTX对象, -sass 开关将列出包含的所有SASS对象 . 例如,为 sm_30 "real architecture"编译的库将包含 sm_30 SASS代码,这在 cuobjdump 输出中很明显 . 例如,为"virtual architecture" compute_50 编译的库将包含 compute_50 PTX代码,这在 cuobjdump 输出中很明显 . 请注意,库(或任何CUDA fatbin对象)可能包含多个体系结构的代码,包括PTX和SASS,或多个SASS版本 .

    如果库包含多个体系结构,我如何知道设备上实际执行的内容 .

    在应用程序启动时,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的策略 .

相关问题