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

时间:2016-10-11 16:18:20

标签: c++ cuda

我在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 个答案:

答案 0 :(得分:3)

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

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

  

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

可以使用CUDA binary utilities来发现这种情况,例如cuobjdump。特别是,-ptx开关将列出包含的所有PTX对象,-sass开关将列出包含的所有SASS对象。为&#34;真实体系结构编译的库#34;例如,sm_30将包含sm_30 SASS代码,这在cuobjdump输出中会很明显。为&#34;虚拟架构编译的库#34;例如,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运行时将接下来选择&#34;兼容&#34; 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对象。

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

    我已经掩饰了许多与&#34;真实&#34;相关的概念。和&#34;虚拟&#34;架构。这是一个复杂的主题,我建议您阅读上面链接的nvcc文档以获取背景信息。例如,任何给定的计算能力具有与真实(SASS)和虚拟(PTX)相同的数字架构是不正确的。例如,对于cc 2.0,存在真实(sm_20)和虚拟(compute_20)架构。例如,对于cc2.1,仅存在真实体系结构(sm_21),虚拟体系结构(compute_21)不存在,应该指定compute_20体系结构。例如,如果您尝试编译compute_21,这将很明显。

    考虑到所有这些&#34;有人可能会问...#,我应该编译哪些架构?

    此问题已在许多以前的SO问题上得到解答,并且在某种程度上是一种意见问题。作为一个有用的参考点,我建议遵循CUDA sample codes项目使用的策略。