assembly 解释AMD RDNA3指令名

jc3wubiy  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(127)

我试图分析我的OpenCL内核为RDNA 3 AMD GPU编译。
我用Radeon GPU Analyzer来做这个。
当我在分析器中加载我的OpenCL内核时,它在gfx 1102(RDNA 3)汇编中显示它的汇编指令。
到目前为止,一切顺利。
不过,我很难解释指令名称。我可以在ISA documentation中查找它们,但通常不会列出完整的指令名称。
在内核的内部循环中,我对16位浮点值执行乘加运算。
我看到这个翻译成:

v_fmac_f16_e32    v?, v?, v?

这似乎是合适的,因为我知道'v'代表vector,fmac代表fused-multiply-add,f16代表16位浮点参数。
但是文档没有描述_e32后缀。
在RDNA 3汇编中_e32 suffic的含义是什么?

nkoocmlb

nkoocmlb1#

我 * 认为 * 后缀..._e32意味着指令被编码为32b。例如,许多通常编码为64b(..._e64)的指令也具有更紧凑的编码,如果控制和输入是常见的情况。指令解码器将具有默认值的等效紧凑编码扩展到较大值。换句话说,你可以用一个类似的操作替换任何.._e32操作,但是要加上一个.._e64后缀,这样程序在语义上就可以了(但是会编码得更大一点)。你可以通过测试来证实我的猜测。
我通过人工观察和了解其他架构的技巧注意到了这种差异。例如,查看来自反汇编器的解码位(也由反汇编器提供正确的选项)沿着输出。

v_add_co_ci_u32_e32 v5, vcc_lo, s3, v1, vcc_lo  // 000000002158: 500A0203
                                                                 ^^^^^^^^ 32b
...
v_mul_f32_e64 v7, v3, -s1                       // 000000002198: D5080007 40000303
                                                                 ^^^^^^^^ ^^^^^^^^ 64b

某些指令缺少任何_eXX后缀。我的猜测是,这些编码是固定大小的,并且在这方面缺乏歧义。例如,HW和SW同意这样的op仅具有单个编码大小。

s_load_dword s5, s[6:7], 0x30                   // 00000000240C: F4000143 FA000030

挖掘周围的指令格式,看看是否有什么,但我不会感到惊讶,如果指令手册省略了这一点。

相关问题