我还没有看到cuda文档描述SASS指令的组合形式。例如,我知道什么是IADD
和IMAD
。但
IMAD.IADD R8, R8, 0x1, R7 ;
Run Code Online (Sandbox Code Playgroud)
不清楚。哪个操作数属于哪个操作码?这是如何执行的?此外,我们是否正在处理1 个 ADD和1 个 MAD,这意味着2 个 ADD和1 个 MUL?或者这被认为是一一MADD,这意味着一个ADD和一个MUL?
怎么样IMAD.MOV.U32 R5, RZ, RZ, 0x0 ;
?这怎么解释呢?
Volta 和 Turing 架构有两个主要执行管道。
ALU 管道执行MOV和IADD3。FMA 管道执行IMAD,包括变体IMAD.IADD和IMAD.MOV。
使用 IMAD 模拟 IADD 和 MOV 允许编译器显式地将指令调度到 FMA 管道而不是 ALU 管道。
从编译器输出中可以清楚地看出,编译器正在模拟二进制整数加法和原始移动IMAD
,这对两者进行了概括。后缀只是反汇编器通过匹配模式并告诉您该操作在语义上等同于更简单的操作。这些IMAD.*
序列巧妙地使用RZ
(零寄存器)0x0
来0x1
实现这一点。当反汇编器看到这样的模式时,它会添加.MOV
op 后缀来表示:“嘿,这只是一个简单的举动。”
例如
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有一个MOV
op,但我几乎没见过。
(我认为还有一个左移 K 版本,它使用2^KIMAD.SHL
的乘数,其中K是移位量。)