관련 문서: RDNA
1. 개요
이 문서에서는 AMD RDNA GPU에서 사용되는 명령어 집합에 대해 다룬다.2. 역사
RDNA의 명령어 집합은 GCN 명령어 집합을 기반으로 설계되었다.3. 레지스터
RDNA 프로그램 상태는 다음과 같은 레지스터들로 구성된다.- 48-bit PC
- 32-bit VGPR * 256 (V0-V255)
- 32-bit SGPR * 106 (S0-S105) [1]
- 64 kB Scratch RAM
- 64-bit Mask
- 64-bit Vector Condition Code
- 1-bit Scalar Condition Code
...
4. 명령어 인코딩
RDNA 명령어는 32-bit/64-bit/96-bit 길이로 인코딩된다.5. 명령어 구성
5.1. 정수 명령어
명령어 | 인코딩 | Sets SCC? | 동작 |
32비트 정수 연산 명령어 | |||
S_ADD_I32 | SOP2 | y | D = S0 + S1, SCC = overflow. |
S_ADD_U32 | SOP2 | y | D = S0 + S1, SCC = carry out. |
S_ADDC_U32 | SOP2 | y | D = S0 + S1 + SCC = overflow. |
S_SUB_I32 | SOP2 | y | D = S0 - S1, SCC = overflow. |
S_SUB_U32 | SOP2 | y | D = S0 - S1, SCC = carry out. |
S_SUBB_U32 | SOP2 | y | D = S0 - S1 - SCC = carry out. |
S_ABSDIFF_I32 | SOP2 | y | D = abs (S0 - S1), SCC = result not zero. |
S_MIN_I32 S_MIN_U32 | SOP2 | y | D = (S0 < S1) ? S0 : S1. SCC = 1 if S0 was min. |
S_MAX_I32 S_MAX_U32 | SOP2 | y | D = (S0 > S1) ? S0 : S1. SCC = 1 if S0 was max. |
S_MUL_I32 | SOP2 | n | D = S0 * S1. Low 32 bits of result. |
S_ADDK_I32 | SOPK | y | D = D + simm16, SCC = overflow. Sign extended version of simm16. |
S_MULK_I32 | SOPK | n | D = D * simm16. Return low 32bits. Sign extended version of simm16. |
S_ABS_I32 | SOP1 | y | D.i = abs (S0.i). SCC=result not zero. |
S_SEXT_I32_I8 | SOP1 | n | D = { 24{S0[7]}, S0[7:0] }. |
S_SEXT_I32_I16 | SOP1 | n | D = { 16{S0[15]}, S0[15:0] }. |
32비트 조건부 연산 명령어 | |||
S_CSELECT_{B32, B64} | SOP2 | n | D = SCC ? S0 : S1. |
S_CMOVK_I32 | SOPK | n | if (SCC) D = signext(simm16). |
S_CMOV_{B32,B64} | SOP1 | n | if (SCC) D = S0, else NOP. |
32비트 비교 연산 명령어 | |||
32비트 비트 연산 명령어 | |||
제어 레지스터 접근 명령어 |
5.2. 벡터 명령어
6. 기타
7. 관련 문서
[1] 2의 거듭제곱인 128이 아닌 106개인데, S106-S107은 Vector Condition Code의 상위 및 하위 비트를 저장하는 데 사용되며, 나머지 레지스터 번호는 16개의 Trap 처리용 SGPR, NULL 레지스터(=상수 0), 마스크 레지스터 등을 지정하는 데 할당된다.