AMDGPU 指令语法¶
指令¶
语法¶
常规指令的语法¶
指令具有以下语法
<
操作码助记符> <
操作数0>, <
操作数1>,... <
修饰符0> <
修饰符1>...
操作数 和 修饰符 的顺序是固定的。大多数 修饰符 是可选的,可以省略。
VOPD 指令的语法¶
VOPDX 和 VOPDY 指令必须使用 :: 运算符连接以形成单个 VOPD 指令
<
VOPDX 指令> :: <
VOPDY 指令>
一个例子
v_dual_add_f32 v255, v255, v2 :: v_dual_fmaak_f32 v6, v2, v3, 1.0
请注意,VOPDX 和 VOPDY 指令不能用作单独的操作码。
操作码助记符¶
操作码助记符描述了操作码语义,并且可以按此顺序包含一个或多个后缀
打包后缀¶
大多数对打包数据进行操作的指令都有 _pk 后缀。除非另有 说明,否则这些指令对由两个值组成的打包数据进行操作并生成打包数据。值的类型由 类型后缀 指示。
例如,以下指令将两对 f16 值相加并生成一对 f16 值
v_pk_add_f16 v1, v2, v3 // Each operand has f16x2 type
类型和大小后缀¶
使用数据操作的指令具有 data 操作数的隐含类型。此数据类型指定为指令助记符的后缀。
有些指令具有 2 个类型后缀:第一个是目标操作数的数据类型,第二个是源 data 操作数的数据类型。
请注意,指令指定的数据类型不适用于其他类型的操作数,例如 地址、偏移量 等。
下表列出了最常用的类型后缀。
类型后缀
打包指令?
数据类型
_b512, _b256, _b128, _b64, _b32, _b16, _b8
否
位。
_u64, _u32, _u16, _u8
否
无符号整数。
_i64, _i32, _i16, _i8
否
有符号整数。
_f64, _f32, _f16
否
浮点。
_b16, _u16, _i16, _f16
是
打包 (b16x2, u16x2, 等)。
没有类型后缀的指令假定使用无类型数据进行操作。无类型数据的大小由大小后缀指定
大小后缀
隐含数据类型
dwords 中所需的寄存器大小
-
b32
1
x2
b64
2
x3
b96
3
x4
b128
4
x8
b256
8
x16
b512
16
x
b32
1
xy
b64
2
xyz
b96
3
xyzw
b128
4
d16_x
b16
1
d16_xy
b16x2
GFX8.0 为 2,GFX8.1 和 GFX9+ 为 1
d16_xyz
b16x3
GFX8.0 为 3,GFX8.1 和 GFX9+ 为 2
d16_xyzw
b16x4
GFX8.0 为 4,GFX8.1 和 GFX9+ 为 2
d16_format_x
b16
1
d16_format_xy
b16x2
1
d16_format_xyz
b16x3
2
d16_format_xyzw
b16x4
2
警告
上述规则存在例外。与操作码指定的类型不同的操作数在描述中被 标记。
具有不同类型的源和目标操作数的指令示例
s_bcnt0_i32_b64
v_cvt_f32_u32
具有一种数据类型的指令示例
v_max3_f32
v_max3_i16
使用打包数据操作的指令示例
v_pk_add_u16
v_pk_add_i16
v_pk_add_f16
对 b128 数据进行操作的无类型指令示例
buffer_store_dwordx4
flat_load_dwordx4
编码后缀¶
大多数 VOP1、VOP2 和 VOPC 指令有几种变体:它们也可以用 VOP3、DPP 和 SDWA 格式编码。
汇编器会根据指令操作数和修饰符自动选择最佳编码,除非明确请求特定的编码。要强制使用特定的编码,可以在指令的操作码中添加后缀
编码
编码后缀
VOP1、VOP2 和 VOPC (32 位) 编码
_e32
VOP3 (64 位) 编码
_e64
DPP 编码
_dpp
SDWA 编码
_sdwa
VOP3 DPP 编码
_e64_dpp
本参考使用编码后缀来指定隐含的编码。当未指定后缀时,假定为本机指令编码。
操作数¶
语法¶
通用操作数的语法在 本文档 中描述。
有关操作数的详细信息,请参阅特定于 GPU 的文档中的操作数链接。
修饰符¶
语法¶
修饰符的语法在 本文档 中描述。
有关单个指令支持的修饰符的信息,可以在特定于 GPU 的文档中找到。