AMDGPU 指令語法¶
指令¶
語法¶
一般指令語法¶
一個指令具有以下語法
<
opcode mnemonic> <
operand0>, <
operand1>,... <
modifier0> <
modifier1>...
運算元 和 修飾符 的順序是固定的。大多數 修飾符 是可選的,可以省略。
VOPD 指令語法¶
VOPDX 和 VOPDY 指令必須使用 :: 運算符串聯,以形成單個 VOPD 指令
<
VOPDX instruction> :: <
VOPDY instruction>
範例
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
類型和大小後綴¶
使用數據操作的指令具有隱含的數據運算元類型。此數據類型指定為指令助記符的後綴。
有些指令有 2 個類型後綴:第一個是目標運算元的數據類型,第二個是來源數據運算元的數據類型。
請注意,指令指定的數據類型不適用於其他類型的運算元,例如地址、偏移量等等。
下表列舉了最常用的類型後綴。
類型後綴
封裝指令?
數據類型
_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 相關文件中找到。