如何了解CUDA / GPU中SASS分析的结果

Ste*_*ang 0 assembly cuda gpu ptx

我使用了CUDA Binary Utilities之一cuobjdump来生成SASS代码,示例结果如下。这些代码尝试从全局内存加载。

/*0028*/ IMAD R6.CC, R3, R5, c[0x0][0x20]; 
/*0030*/ IMAD.HI.X R7, R3, R5, c[0x0][0x24]; 
/*0040*/ LD.E R2, [R6]; //load
Run Code Online (Sandbox Code Playgroud)
  1. 我在哪里可以获得解释每个指令含义的SASS代码的完整手册。在“ cuda二进制实用程序”中,它仅提供指令含义的一般说明。例如,它没有解释“ R1.cc”,“ IMAD.HI.X”和LD.e的含义。

  2. 第二条指令的含义是什么。我猜第一个是计算每个线程应该加载的内存地址,而第三个指令是将全局内存加载到寄存器中。我对第二条指令的含义一无所知。

  3. 我猜cuda将一些参数信息(例如网格大小,块大小和数组基地址)保存到常量内存中。在这种情况下,c [0x0] [0x20]是数组的基地址。我的问题是我如何获得这些信息。

use*_*016 5

  1. 我在哪里可以获得解释每个指令含义的SASS代码的完整手册。

据我所知,SASS大多是无证的(只有基本参考资料),因为它在体系结构之间有所不同。但是,PTX已被详细记录,并且许多SASS指令都具有与PTX相当的等同符号,您可以从中推断其含义。您可能还希望转储带有源信息的SASS,以更好地了解发生了什么。

但是,鉴于这两个文档,您可以或多或少地将SASS转换回PTX并猜测指令的含义:

/*0028*/ IMAD R6.CC, R3, R5, c[0x0][0x20];
Run Code Online (Sandbox Code Playgroud)

扩展精度整数乘法加法:将R3与R5相乘,将总和与常数存储在0中,偏移量0x20,并以进位方式存储在R6中。

/*0030*/ IMAD.HI.X R7, R3, R5, c[0x0][0x24];
Run Code Online (Sandbox Code Playgroud)

整数与提取相乘:将R3与R5相乘,提取上半部分,将上半部分的常数与存储体0中的值相乘,偏移量0x24,并带进位存储在R7中。

/*0040*/ LD.E R2, [R6]; //load
Run Code Online (Sandbox Code Playgroud)

加载:将寄存器对R7:R6指向的内容加载到R2中。

正如@njuffa在下面的评论中解释的那样

整个计算将R3与R5相乘,将64位乘积与c [0] [24]:c [0] [20]中的64位常量相加,然后使用所得的64位地址检索R2。

  1. 我猜cuda将一些参数信息(例如网格大小,块大小和数组基地址)保存到常量内存中。[...]我的问题是我如何获得这些信息。

其中内建(threadIdxblockIdxblockDimgridDim,等)驻留不确定,而且可能架构之间变化。实际上,它们中的一些存储在专用寄存器中,而另一些则存储在共享存储器中。但这是一个实现细节。

注意:编辑以整合@njuffa的评论。

  • 小更正:将寄存器对 R7:R6* 所指向的内容加载到 R2 中。`.X` 指定了一个带有进位的*扩展*操作,我记得这个后缀首先在摩托罗拉的 68K 系列中用于这个目的。整个计算将 R3 与 R5 相乘,将 64 位乘积与 c[0][24]:c[0][20] 中的 64 位常数相加,并使用得到的 64 位地址检索 R2。 (2认同)