如何理解 SASS 中的分析结果 CUDA/GPU
How to understand the result of SASS analysis in CUDA/GPU
我使用 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
我在哪里可以找到解释每条指令含义的 SASS 代码的完整手册。在 "cuda binary utility " 中,它只是对指令的含义进行了一般性的解释。例如它没有解释 "R1.cc"、"IMAD.HI.X" 和 LD.e 的含义。
第二个指令是什么意思。我猜第一条是计算每个线程应该加载的内存地址,而第三条指令是将全局内存加载到寄存器中。我不知道第二条指令的含义。
我猜是cuda把一些参数信息,比如grid size,block size,array base address保存到constant memory中。
在这种情况下,c[0x0][0x20] 是数组的基地址。我的问题是如何获得这些信息。
- Where can i get the full manual of SASS code that explain the meaning of each instruction.
据我所知没有这样的东西,SASS 大部分没有记录(只有一个 basic reference), as it varies between architectures. However, PTX is thoroughly documented 并且许多 SASS 指令有一个接近的 PTX 等价物,从中你可以推断出意思。您可能还想转储带有源信息的 SASS 以更好地理解正在发生的事情。
但是鉴于这两个文档,您或多或少可以将 SASS 翻译回 PTX 并猜测指令的含义:
/*0028*/ IMAD R6.CC, R3, R5, c[0x0][0x20];
Extended-precision integer multiply-add:将R3与R5相乘,与bank 0中的常数求和,偏移量0x20,用carry-out.
存储在R6中
/*0030*/ IMAD.HI.X R7, R3, R5, c[0x0][0x24];
Integer multiply-add with extract:将R3与R5相乘,提取上半部分,将上半部分与bank 0中的常数相加,偏移量0x24,用carry-in存储在R7中。
/*0040*/ LD.E R2, [R6]; //load
Load:通过寄存器对R7:R6.
将pointed-to载入R2
作为:
The entire computation multiplies R3 with R5, adds the 64-bit product to the 64-bit constant in c[0][24]:c[0][20], and uses the resulting 64-bit address to retrieve R2.
- I guess that cuda save some parameter information like grid size, block size and array base address into constant memory. [...] My question is how can i get those information.
内置函数(threadIdx
、blockIdx
、blockDim
、gridDim
等)所在的位置未指定,并且可能因体系结构而异。实际上,其中一些在 special-purpose 寄存器中,另一些在共享内存中。但这是一个实现细节。
注意:编辑以整合@njuffa 的评论。
我使用 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
我在哪里可以找到解释每条指令含义的 SASS 代码的完整手册。在 "cuda binary utility " 中,它只是对指令的含义进行了一般性的解释。例如它没有解释 "R1.cc"、"IMAD.HI.X" 和 LD.e 的含义。
第二个指令是什么意思。我猜第一条是计算每个线程应该加载的内存地址,而第三条指令是将全局内存加载到寄存器中。我不知道第二条指令的含义。
我猜是cuda把一些参数信息,比如grid size,block size,array base address保存到constant memory中。 在这种情况下,c[0x0][0x20] 是数组的基地址。我的问题是如何获得这些信息。
- Where can i get the full manual of SASS code that explain the meaning of each instruction.
据我所知没有这样的东西,SASS 大部分没有记录(只有一个 basic reference), as it varies between architectures. However, PTX is thoroughly documented 并且许多 SASS 指令有一个接近的 PTX 等价物,从中你可以推断出意思。您可能还想转储带有源信息的 SASS 以更好地理解正在发生的事情。
但是鉴于这两个文档,您或多或少可以将 SASS 翻译回 PTX 并猜测指令的含义:
/*0028*/ IMAD R6.CC, R3, R5, c[0x0][0x20];
Extended-precision integer multiply-add:将R3与R5相乘,与bank 0中的常数求和,偏移量0x20,用carry-out.
存储在R6中/*0030*/ IMAD.HI.X R7, R3, R5, c[0x0][0x24];
Integer multiply-add with extract:将R3与R5相乘,提取上半部分,将上半部分与bank 0中的常数相加,偏移量0x24,用carry-in存储在R7中。
/*0040*/ LD.E R2, [R6]; //load
Load:通过寄存器对R7:R6.
将pointed-to载入R2作为
The entire computation multiplies R3 with R5, adds the 64-bit product to the 64-bit constant in c[0][24]:c[0][20], and uses the resulting 64-bit address to retrieve R2.
- I guess that cuda save some parameter information like grid size, block size and array base address into constant memory. [...] My question is how can i get those information.
内置函数(threadIdx
、blockIdx
、blockDim
、gridDim
等)所在的位置未指定,并且可能因体系结构而异。实际上,其中一些在 special-purpose 寄存器中,另一些在共享内存中。但这是一个实现细节。
注意:编辑以整合@njuffa 的评论。