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



我使用 cuobjdump(CUDA 二进制实用程序之一)生成 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
  1. 我在哪里可以获得完整的 SASS 代码手册,其中解释了每个指令的含义。在"cuda二进制实用程序"中,它只提供了指令含义的一般解释。例如,它没有解释"R1.cc","IMAD.HI"的含义。X"和LD.e .

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

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

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

据我所知,没有这样的事情,SASS大多是没有文档的(只有一个基本的参考),因为它因架构而异。但是,PTX 有详尽的文档记录,许多 SASS 指令具有接近的 PTX 等效项,您可以从中推断其含义。您可能还想转储带有源信息的 SASS,以更好地了解正在发生的事情。

但是给定这两个文档,您或多或少可以将 SASS 翻译回 PTX 并猜测说明的含义:

/*0028*/ IMAD R6.CC, R3, R5, c[0x0][0x20];

扩展精度整数乘加:将 R3 乘以 R5,与组 0 中的常量求和,偏移量0x20,存储在 R6 中并结转。

/*0030*/ IMAD.HI.X R7, R3, R5, c[0x0][0x24];
整数乘加与提取

:将 R3 乘以 R5,提取上半部分,将上半部分与银行 0 中的常量相加,偏移0x24,存储在带有结转的 R7 中。

/*0040*/ LD.E R2, [R6]; //load
加载:

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

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

整个计算将 R3 乘以 R5,将 64 位乘积添加到 c[0][24]:c[0][20] 中的 64 位常量中,并使用生成的 64 位地址检索 R2。

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

内置(threadIdxblockIdxblockDimgridDim等)所在的位置是未指定的,可能因架构而异。实际上,其中一些位于专用寄存器中,而另一些则位于共享内存中。但这是一个实现细节。

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

最新更新