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

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


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

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

最佳答案

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


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


ALU管道执行MOV和IADD3。
FMA管道执行IMAD,包括变体IMAD.IADD和IMAD.MOV。

使用IMAD效仿IADD和MOV允许编译明确时间表的说明FMA管,而不是算术逻辑单元管线。

从编译器输出中可以清楚地看出,编译器正在使用IMAD模拟二进制整数加法和原始移动,从而将二者通用化。后缀只是反汇编器,可以通过匹配模式并告诉您该操作在语义上等效于更简单的操作来实现。 IMAD.*序列使用RZ(零寄存器),0x00x1可以很好地实现这一目的。当反汇编程序看到这种模式时,它会添加.MOV op后缀,说:“嘿,这只是一个简单的举动。”

例如。

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是移位量。)

关于cuda - SASS指令的组合格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59777333/

10-10 10:24