SASS指令的组合格式

mah*_*ood 4 cuda

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

IMAD.IADD R8, R8, 0x1, R7 ;
Run Code Online (Sandbox Code Playgroud)

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

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

Tim*_*Tim 5

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
Run Code Online (Sandbox Code Playgroud)

是:

R8 = 1*R8 + R7 = R8 + R7
IADD R8, R8, R7
Run Code Online (Sandbox Code Playgroud)

(如果IADD存在的话。)

对于本MOV例类似,您会看到它正在使用RZ. 它正在模仿以下内容。

MOV R5, 0x0
Run Code Online (Sandbox Code Playgroud)

Volta有一个MOVop,但我几乎没见过。

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