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

时间:2016-01-28 07:14:18

标签: 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
  1. 我在哪里可以获得解释每条指令含义的SASS代码的完整手册。在“cuda二进制实用程序”中,它仅提供指令含义的一般说明。例如它没有解释“R1.cc”,“IMAD.HI.X”和LD.e。

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

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

1 个答案:

答案 0 :(得分:4)

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

据我所知,没有这样的东西,SASS大多没有文档(只有basic reference),因为它在架构之间有所不同。但是,PTX为thoroughly documented,并且许多SASS指令具有接近的PTX等效值,您可以从中推断其含义。您可能还希望使用源信息转储SASS以更好地了解正在发生的事情。

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

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

Extended-precision integer multiply-add:将R3与R5相乘,与存储区0中的常数相加,偏移量为0x20,存储在R6中,带有进位输出。

/*0030*/ IMAD.HI.X R7, R3, R5, c[0x0][0x24];

Integer multiply-add with extract:将R3与R5相乘,提取上半部分,将上半部分与存储体0中的常数相加,偏移量为0x24,存储在R7中并带有进位。

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

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

作为@njuffa explains in the comment below

  

整个计算将R3与R5相乘,将64位乘积与c [0] [24]中的64位常数相加:c [0] [20],并使用生成的64位地址进行检索R2。

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

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

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