由于实验结果不太好,现在已经开始往最底层的sass修改上努力了,鉴于nvidia官方出于大概是商业目的,关于sass的内容少之又少,因此只能零星地从各种paper或者之类的东西里寻找。前两天发现了一个文档,是关于Volta架构的,里面讲了一些关于sass的内容,大致和 maxas 的介绍差不多但是更好懂,特此翻译了相关部分,也就是第二章的内容。
ps : 点此下载原文
Volta使用的指令编码方式与Pascal和Maxwell架构不同。
与以前架构最为不同的地方就是,Volta使用128位来编码每个指令和指令对应的控制信息。以前的架构都是使用64位编码每个指令,然后再分出额外的64位来表示控制信息,而一条控制信息可能是和多条指令相关联的。下面是个相关的例子:
以上代码是使用nvdisasm反汇编出来的,其分成两个64位用于方便显示,第一行只是编码后的指令信息,第二行包含指令信息和控制信息。
据我们从彻底的汇编指令中得到的知识,这128位是按照如下规则划分的:
Kepler架构将控制信息引入了编译器对于指令的编码调度过程。控制信息能够防止数据冲突并且允许简单的片上逻辑,这使GPU获得更高的计算密度和更低能耗
在Volta上,128位包括指令和指令相关的控制信息
Volta之前的架构都是一条控制信息和多条指令相连(在Pascal和Maxwell里是3条,Kepler里是7条)。每一条控制信息表示了与它相关的这几条指令的调度方式。下面的代码就是Pascal架构下的示例,一共包括4个64位字,第一个64字只有十六进制的表示而没有对应的指令,就是控制字段;而余下的三个就是指令。
/* 0x000f8800fe2007f1 */
/*0288*/ @P5 LDG.E.CI R66, [R86+0x100]; /* 0xeed4a00010055642 */
/*0290*/ @!P5 MOV R66, RZ; /* 0x5c9807800ffd0042 */
/*0298*/ @P6 LDG.E.CI R67, [R86+0x180]; /* 0xeed4a00018065643 */
控制信息在不同的架构上编码方式不同,具体如下:
Volta,Pascal和Maxwell架构中的控制信息的组织方式都是一致的,每个部分包括6个编码域,如下所示:
其各自的意义如下:
Volta的SM被分成了四个处理块。相同warp上的指令会被分配给一个特定的块,并且只能使用这一个块内的计算资源。warp和(处理块中)调度器的映射关系就是 scheduler_id = warp_id%4,为了证明它,我们进行了实验(实验略)
相比于以前的架构,Volta使用更多的位编码指令。
和以前那些将操作指令放在最高有效位的架构(Pascal,Maxwell和Kepler)不同的是,Volta将操作指令放在第一个64位字的最低有效位。我们在附录中展示了Pascal和Volta的编码。
Volta的操作码的长度是10-13位。
和以前的架构一样,Volta的操作可以是寄存器(通用,特殊或者断言),内存地址(常量,共享或者全局)。断言由4位表示:第一位是有效位,剩下三位是一个断言寄存器的编号。