首页 > 解决方案 > SASS指令的组合格式

问题描述

我还没有看到描述 SASS 指令组合形式的 cuda 文档。例如,我知道什么是IADDIMAD。但

IMAD.IADD R8, R8, 0x1, R7 ;

不清楚。哪个操作数属于哪个操作码?那是如何执行的?此外,我们是否在处理一个 ADD一个 MAD,这意味着两个 ADD一个 MUL?或者这被认为是一个 MADD,这意味着一个 ADD一个 MUL

怎么样IMAD.MOV.U32 R5, RZ, RZ, 0x0 ;?这是怎么解释的?

标签: cuda

解决方案


Volta 和 Turing 架构有两个主要的执行管道。

  1. FMA 管道负责 FFMA、FMUL、FADD、FSWZADD 和 IMAD 指令。
  2. ALU 管道负责整数(IMAD 除外)、位操作、逻辑和数据移动指令。

ALU 管道执行MOVIADD3。FMA 管道执行IMAD ,包括变体IMAD.IADDIMAD.MOV

使用 IMAD 模拟 IADD 和 MOV 允许编译器将指令显式调度到 FMA 管道而不是 ALU 管道。

从编译器输出中可以清楚地看出,编译器正在模拟二进制整数加法和原始移动IMAD,它概括了两者。后缀只是反汇编器通过匹配模式并告诉您操作在语义上等同于更简单的操作而变得很好。IMAD.*序列很巧妙地使用(RZ零寄存器),0x00x1实现了这一点。当反汇编器看到这样的模式时,它会添加.MOVop 后缀说,“嘿,这只是一个简单的动作。”

例如

IMAD.IADD R8, R8, 0x1, R7

是:

R8 = 1*R8 + R7 = R8 + R7
IADD R8, R8, R7

(如果IADD存在。)

同样,对于这种MOV情况,您会看到它正在使用RZ. 它正在模拟以下内容。

MOV R5, 0x0

Volta中有一个MOV操作,但我几乎从未见过。

(我认为还有一个左移 K 版本IMAD.SHL,它使用2^K的乘数,其中K是移位量。)


推荐阅读