cuda - SASS指令的组合格式
问题描述
我还没有看到描述 SASS 指令组合形式的 cuda 文档。例如,我知道什么是IADD
和IMAD
。但
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 管道而不是 ALU 管道。
从编译器输出中可以清楚地看出,编译器正在模拟二进制整数加法和原始移动IMAD
,它概括了两者。后缀只是反汇编器通过匹配模式并告诉您操作在语义上等同于更简单的操作而变得很好。IMAD.*
序列很巧妙地使用(RZ
零寄存器),0x0
并0x1
实现了这一点。当反汇编器看到这样的模式时,它会添加.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是移位量。)
推荐阅读
- python - 代码结束时在 Python 中再次启动函数
- mysql - Mysql - 基于搜索表单在表之间传输数据
- drupal-7 - 在 Drupal 7 Tpl 文件中使用 db_select 的最佳方法是什么?
- android - 在 Kotlin 中将可变的实时数据解析为数组
- mysql - 使用前 2 个条目中的值向表中添加移动平均列
- django - 从 send_mail 上的地址更改
- angular - rxjs-compat 与 pipe() 方法
- c# - 在不更改 DataGridView 表的情况下搜索 DataGridView
- android - 使用“工具”时,“这个”包含什么?
- python - 在 tensorflow 1.15 中如何正确传递权重和偏差?