AMD RDNA3指令名称解读

问题描述 投票:0回答:2

我正在尝试分析为 RDNA3 AMD GPU 编译的 OpenCL 内核。

我使用 Radeon GPU 分析器

当我在分析器中加载 OpenCL 内核时,它会在 gfx1102 (RDNA3) 程序集中显示其汇编指令。

到目前为止,一切都很好。

不过,我很难解释指令名称。 我可以在 ISA 文档 中查找它们,但通常不会列出完整的指令名称。

在内核的内部循环中,我对 16 位浮点值进行乘法加法。

我看到这翻译成:

v_fmac_f16_e32    v?, v?, v?

这似乎很合适,因为我知道“v”代表向量,fmac代表融合乘加,f16代表16位浮点参数。

但是文档没有描述

_e32
后缀。

RDNA3 组装中的

_e32
suffic 是什么意思?

assembly opencl amd-gpu
2个回答
4
投票

I think

..._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
后缀。我的猜测是,这些编码是固定大小的,并且对此缺乏歧义。例如。硬件和软件一致认为此类操作仅具有单一编码大小。

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

仔细研究说明格式,看看是否有什么东西,但如果说明手册省略了这一点,我不会感到惊讶。


0
投票

在您的情况下,

v_fmac_f16_e32
是vop2指令,
v_fmac_f16_e64
是vop3指令。

© www.soinside.com 2019 - 2024. All rights reserved.