From b8a55d5f688299fe83c322f80e67a3cd9f138964 Mon Sep 17 00:00:00 2001 From: qazal <77887910+Qazalin@users.noreply.github.com> Date: Fri, 27 Feb 2026 21:27:27 +0200 Subject: [PATCH] sqtt: new packet types, add discovery script (#14960) --- extra/sqtt/examples/discover_ops.py | 148 ++++++++++++++++++ extra/sqtt/examples/generate_examples.py | 1 + .../examples/gfx1100/profile_py_run_0.pkl | Bin 0 -> 151247 bytes .../examples/gfx1100/profile_py_run_1.pkl | Bin 0 -> 151255 bytes .../examples/gfx1200/profile_py_run_0.pkl | Bin 0 -> 136371 bytes .../examples/gfx1200/profile_py_run_1.pkl | Bin 0 -> 136224 bytes test/amd/test_sqtt_tables.py | 3 + test/amd/test_sqttmap.py | 10 +- tinygrad/renderer/amd/sqtt.py | 24 ++- 9 files changed, 174 insertions(+), 12 deletions(-) create mode 100644 extra/sqtt/examples/discover_ops.py create mode 100644 extra/sqtt/examples/gfx1100/profile_py_run_0.pkl create mode 100644 extra/sqtt/examples/gfx1100/profile_py_run_1.pkl create mode 100644 extra/sqtt/examples/gfx1200/profile_py_run_0.pkl create mode 100644 extra/sqtt/examples/gfx1200/profile_py_run_1.pkl diff --git a/extra/sqtt/examples/discover_ops.py b/extra/sqtt/examples/discover_ops.py new file mode 100644 index 0000000000..76f37e3f0f --- /dev/null +++ b/extra/sqtt/examples/discover_ops.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +# Run all ALU and memory instructions in the ISA +import functools, inspect +from enum import Enum +from tinygrad import Tensor, Device, dtypes +from tinygrad.uop.ops import UOp, Ops, KernelInfo, AddrSpace +from tinygrad.renderer.amd.dsl import Inst, Reg, OPERANDS, SrcField, VGPRField, SGPRField, SSrcField, SBaseField, AlignedSGPRField, BitField +from tinygrad.renderer.amd.dsl import FixedBitField, EnumBitField, s, v, NULL, VCC_LO +from extra.gemm.amd_asm_matmul import Kernel + +# skip instructions that mutate wave state (PC, EXEC, allocations, signals) +SKIP = {"S_SETPC_B64", "S_SWAPPC_B64", "S_RFE_B64", "S_BARRIER_SIGNAL_ISFIRST", "S_GET_BARRIER_STATE", "S_ALLOC_VGPR", "S_SLEEP_VAR", "S_GETPC_B64", + "S_SENDMSG_RTN_B32", "S_SENDMSG_RTN_B64"} +# skip barriers, s_waits, wrap level atomics, and ray tracing (bvh) +SKIP_SUBSTR = ["SAVEEXEC", "CMPX", "WREXEC", "MOVREL", "ATOMIC", "S_BUFFER_", "S_ATC_PROBE", "BARRIER", "S_WAITCNT", "BVH", + "DS_CMPSTORE_RTN", "DS_WRAP_RTN_B32", "DS_ORDERED_COUNT", "DS_GWS", "GS_REG", "GLOBAL_LOAD_LDS", "GLOBAL_STORE_BLOCK"] + +ALU_FORMATS = {"VOP1", "VOP1_LIT", "VOP1_SDST", "VOP2", "VOP2_LIT", "VOP3", "VOP3_SDST", "VOP3SD", "VOP3P", "VOP3P_MFMA", "VOP3PX2", + "VOPC", "SOP1", "SOP1_LIT", "SOP2", "SOP2_LIT", "SOPC", "SOPC_LIT", "SOPK", "SOPK_LIT", "VINTERP"} +# intentionally not testing scratch memory ops +MEM_FORMATS = {"VGLOBAL", "GLOBAL", "SMEM", "DS"} + +def should_skip(op:Enum) -> bool: return (name:=op.name) in SKIP or any(sub in name for sub in SKIP_SUBSTR) + +# ** named register assignments + +# ALU operands +ALU_VGPR_STRIDE = 16 # v[0], v[16], v[32], ... per ALU operand slot +ALU_SGPR_STRIDE = 4 # s[0], s[4], s[8], ... per ALU operand slot + +# memory address registers +S_KERNARG_PTR = (0, 1) +S_BUF_PTR = (2, 3) +V_VADDR = (0, 1) +V_DS_ADDR = 0 + +# memory data registers +MEM_VGPR_BASE = 32 # v[32], v[48], ... for vdst/vdata/vsrc +MEM_VGPR_STRIDE = 16 # spacing between memory data vgpr slots +MEM_SGPR_BASE = 8 # s[8], s[10], ... for SMEM sdata +MEM_SGPR_STRIDE = 2 # spacing between memory data sgpr slots + +# ** create an ALU instruction based on the operands + +def create_alu_inst(op:Enum, builder:functools.partial[Inst]) -> Inst: + inst_cls, operands, slot = builder.func, OPERANDS[op], 0 + kwargs:dict[str, Reg|int] = {} + for name, field in inst_cls._fields: + if isinstance(field, (FixedBitField, EnumBitField)): continue + nregs = max(1, operands[name][1] // 32) if name in operands else 1 + is_sreg = name in operands and "SREG" in str(operands[name][2]) + base_v, base_s = slot * ALU_VGPR_STRIDE, slot * ALU_SGPR_STRIDE + if name == "sdst" and isinstance(field, SGPRField): reg = VCC_LO + elif is_sreg and not isinstance(field, VGPRField): reg = VCC_LO + elif isinstance(field, VGPRField): reg = v[base_v:base_v+nregs-1] if nregs > 1 else v[base_v] + elif isinstance(field, SSrcField): reg = VCC_LO if nregs <= 2 else s[base_s:base_s+nregs-1] if nregs > 1 else s[base_s] + elif isinstance(field, SGPRField): reg = s[base_s:base_s+nregs-1] if nregs > 1 else s[base_s] + elif isinstance(field, SrcField): reg = v[base_v:base_v+nregs-1] if nregs > 1 else v[base_v] + else: reg = None + if reg is not None: kwargs[name] = reg; slot += 1 + elif isinstance(field, BitField): kwargs[name] = field.default + return builder(**kwargs) + +# ** create a memory instruction with pre set address registers + +MEM_PRESET_REGS:dict[str, dict[str, Reg]] = { + "VGLOBAL":{"saddr":s[S_BUF_PTR[0]:S_BUF_PTR[1]], "vaddr":v[V_VADDR[0]:V_VADDR[1]]}, + "GLOBAL":{"saddr":s[S_BUF_PTR[0]:S_BUF_PTR[1]], "addr":v[V_DS_ADDR]}, # addr is 32-bit offset when saddr is valid SGPR + "DS":{"addr":v[V_DS_ADDR]}, + "SMEM":{"sbase":s[S_KERNARG_PTR[0]:S_KERNARG_PTR[1]], "soffset":NULL}, +} + +def create_mem_inst(op:Enum, builder:functools.partial[Inst]) -> Inst: + inst_cls, operands, field_map = builder.func, OPERANDS.get(op, {}), MEM_PRESET_REGS.get(builder.func.__name__, {}) + kwargs:dict[str, Reg|int] = {} + vslot, sslot = 0, 0 + for name, field in inst_cls._fields: + if isinstance(field, (FixedBitField, EnumBitField)): continue + if name in field_map: + kwargs[name] = field_map[name] + continue + nregs = max(1, operands[name][1] // 32) if name in operands else 1 + if isinstance(field, VGPRField): + vi = MEM_VGPR_BASE + vslot * MEM_VGPR_STRIDE + kwargs[name] = v[vi:vi+nregs-1] if nregs > 1 else v[vi] + vslot += 1 + elif isinstance(field, (SGPRField, AlignedSGPRField, SBaseField)): + si = MEM_SGPR_BASE + sslot * MEM_SGPR_STRIDE + kwargs[name] = s[si:si+nregs-1] if nregs > 1 else s[si] + sslot += 1 + elif isinstance(field, BitField): kwargs[name] = field.default + return builder(**kwargs) + +# ** collect all memory and ALU instructions from the ISA autogen + +def collect_instructions() -> tuple[list[Inst], list[Inst], list[str]]: + op_map:dict[Enum, functools.partial[Inst]] = {} + for name, obj in inspect.getmembers(all_insts): + if isinstance(obj, functools.partial) and len(obj.args) == 1: op_map[obj.args[0]] = obj + alu_insts:list[Inst] = [] + mem_insts:list[Inst] = [] + skipped:list[str] = [] + for op_enum, builder in op_map.items(): + if should_skip(op_enum) or op_enum not in OPERANDS: skipped.append(op_enum.name); continue + fmt = builder.func.__name__ + if fmt in ALU_FORMATS: alu_insts.append(create_alu_inst(op_enum, builder)) + elif fmt in MEM_FORMATS: mem_insts.append(create_mem_inst(op_enum, builder)) + return alu_insts, mem_insts, skipped + +def exec_insts(insts:list): + k = Kernel(arch) + # ** prologue for global memory + k.emit(s_load_b64(sdata=s[S_BUF_PTR[0]:S_BUF_PTR[1]], sbase=s[S_KERNARG_PTR[0]:S_KERNARG_PTR[1]], soffset=NULL)) + k.waitcnt(lgkm=0) + k.emit(v_mov_b32_e32(v[V_VADDR[0]], 0)) + k.emit(v_mov_b32_e32(v[V_VADDR[1]], 0)) + # ** emit + for inst in insts: k.emit(inst) + k.emit(s_endpgm()) + # ** run + NUM_THREADS, NUM_GRIDS, BUF_SIZE = 32, 1, 1024*1024 + def fxn(A:UOp, B:UOp, C:UOp) -> UOp: + lidx, gidx = UOp.special(NUM_THREADS, "lidx0"), UOp.special(NUM_GRIDS, "gidx0") + lds = UOp(Ops.DEFINE_LOCAL, dtypes.uint8.ptr(size=BUF_SIZE, addrspace=AddrSpace.LOCAL), (), "lds") + sink = UOp.sink(A.base, B.base, C.base, lds, lidx, gidx, arg=KernelInfo(name="discover_ops")) + return UOp(Ops.PROGRAM, src=(sink, UOp(Ops.DEVICE, arg="AMD"), UOp(Ops.LINEAR, src=tuple(UOp(Ops.INS, arg=x) for x in k.finalize())))) + A = Tensor.empty(BUF_SIZE, dtype=dtypes.uint8) + B = Tensor.empty(1, dtype=dtypes.uint8) + C = Tensor.empty(1, dtype=dtypes.uint8) + Tensor.custom_kernel(A, B, C, fxn=fxn)[0].realize() + +if __name__ == "__main__": + import sys + arch = Device[Device.DEFAULT].renderer.arch + if arch.startswith("gfx12"): + from tinygrad.runtime.autogen.amd.rdna4.ins import * + import tinygrad.runtime.autogen.amd.rdna4.ins as all_insts + elif arch.startswith("gfx11"): + from tinygrad.runtime.autogen.amd.rdna3.ins import * + import tinygrad.runtime.autogen.amd.rdna3.ins as all_insts + # these don"t exist in RDNA3, only RDNA3.5 and above + SKIP.update(["S_FMAAK_F32", "S_FMAMK_F32"]) + else: + print(f"{arch} not supported yet") + sys.exit(0) + alu_insts, mem_insts, skipped = collect_instructions() + print(f"collected {len(alu_insts)} ALU + {len(mem_insts)} memory instructions ({len(skipped)} skipped)") + exec_insts(mem_insts+alu_insts) diff --git a/extra/sqtt/examples/generate_examples.py b/extra/sqtt/examples/generate_examples.py index 48453764d0..0e815f928f 100644 --- a/extra/sqtt/examples/generate_examples.py +++ b/extra/sqtt/examples/generate_examples.py @@ -9,6 +9,7 @@ EXAMPLES = [ "test/backend/test_custom_kernel.py TestCustomKernel.test_empty", "test/test_tiny.py TestTiny.test_plus", "test/test_tiny.py TestTiny.test_gemm", + "extra/sqtt/examples/discover_ops.py" ] if __name__ == "__main__": diff --git a/extra/sqtt/examples/gfx1100/profile_py_run_0.pkl b/extra/sqtt/examples/gfx1100/profile_py_run_0.pkl new file mode 100644 index 0000000000000000000000000000000000000000..804ed3bb437a7724757b6a83229e4e8eab62d6a3 GIT binary patch literal 151247 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 B{L26U literal 0 HcmV?d00001 diff --git a/extra/sqtt/examples/gfx1100/profile_py_run_1.pkl b/extra/sqtt/examples/gfx1100/profile_py_run_1.pkl new file mode 100644 index 0000000000000000000000000000000000000000..e67773b609c832776d5fdcad4da787fc5f772c67 GIT binary patch literal 151255 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 z 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 X3S&hTgQ@fT{Ql(g$xU?Wbl?9EgCbJ4 literal 0 HcmV?d00001 diff --git a/extra/sqtt/examples/gfx1200/profile_py_run_1.pkl b/extra/sqtt/examples/gfx1200/profile_py_run_1.pkl new file mode 100644 index 0000000000000000000000000000000000000000..d28e3537e77fca81e63060bb1b42af3a5361d8c9 GIT binary patch literal 136224 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 WV6{seE3pVpeRaSeY_f2o{{J5V?>##J literal 0 HcmV?d00001 diff --git a/test/amd/test_sqtt_tables.py b/test/amd/test_sqtt_tables.py index 8ced6b4ead..6f44095743 100644 --- a/test/amd/test_sqtt_tables.py +++ b/test/amd/test_sqtt_tables.py @@ -134,7 +134,10 @@ class TestSQTTMatchesBinary(unittest.TestCase): def _test_bit_counts(self, layout: int): if not (tables := extract_bit_tables()): self.skipTest("rocprof-trace-decoder not installed") from tinygrad.renderer.amd.sqtt import PACKET_TYPES_RDNA3, PACKET_TYPES_RDNA4 + # rocprof's bit table says L4 type 7 (TS_DELTA_S8_W3) is 72 bits, but the actual decoder uses 64 bits + skip = {(4, 7)} for type_id, pkt_cls in {3: PACKET_TYPES_RDNA3, 4: PACKET_TYPES_RDNA4}[layout].items(): + if (layout, type_id) in skip: continue with self.subTest(packet=pkt_cls.__name__): self.assertEqual(pkt_cls._size_nibbles * 4, tables[layout - 2][type_id]) # type: ignore[attr-defined] diff --git a/test/amd/test_sqttmap.py b/test/amd/test_sqttmap.py index e9c5d42753..162d31e653 100644 --- a/test/amd/test_sqttmap.py +++ b/test/amd/test_sqttmap.py @@ -2,7 +2,7 @@ import unittest, pickle from typing import Iterator from pathlib import Path -from tinygrad.helpers import DEBUG +from tinygrad.helpers import DEBUG, OSX from tinygrad.renderer.amd.sqtt import print_packets, map_insts from tinygrad.runtime.autogen.amd.rdna3.ins import s_endpgm from test.amd.disasm import disasm @@ -10,7 +10,7 @@ from test.amd.disasm import disasm import tinygrad EXAMPLES_DIR = Path(tinygrad.__file__).parent.parent / "extra/sqtt/examples" -def rocprof_inst_traces_match(sqtt, prg, target): +def rocprof_inst_traces_match(sqtt, prg, target, pass_rocprof_err=False): from tinygrad.viz.serve import amd_decode from extra.sqtt.roc import decode as roc_decode, InstExec addr_table = amd_decode(prg.lib, target) @@ -30,7 +30,7 @@ def rocprof_inst_traces_match(sqtt, prg, target): rocprof_inst = next(rwaves_iter[info.wave][0]) ref_pc = rocprof_inst.pc-prg.base # always check pc matches - assert ref_pc == info.pc, f"pc mismatch {ref_pc}:{disasm_map[rocprof_inst.pc]} != {info.pc}:{disasm(info.inst)}" + assert ref_pc == info.pc or pass_rocprof_err, f"pc mismatch {ref_pc}:{disasm_map[rocprof_inst.pc]} != {info.pc}:{disasm(info.inst)}" # special handling for s_endpgm, it marks the wave completion. if info.inst == s_endpgm(): completed_wave = list(rwaves_iter[info.wave].pop(0)) @@ -67,7 +67,9 @@ class TestSQTTMapBase(unittest.TestCase): if not event.itrace: continue if event.kern not in kern_events: continue with self.subTest(example=name, kern=event.kern): - passed_insts, n_waves, n_units = rocprof_inst_traces_match(event, kern_events[event.kern], target) + # rocprof OSX has a bug for sopk decoding, linux rocprof works + pass_rocprof_err = OSX and target == "gfx1200" and name.startswith("profile_py") + passed_insts, n_waves, n_units = rocprof_inst_traces_match(event, kern_events[event.kern], target, pass_rocprof_err) if n_waves: print(f"{name}: passed for {passed_insts} instructions across {n_waves} waves scheduled on {n_units} wave units") class TestSQTTMapRDNA3(TestSQTTMapBase): target = "gfx1100" diff --git a/tinygrad/renderer/amd/sqtt.py b/tinygrad/renderer/amd/sqtt.py index a2a2f9c599..6f8c1226e9 100644 --- a/tinygrad/renderer/amd/sqtt.py +++ b/tinygrad/renderer/amd/sqtt.py @@ -46,6 +46,7 @@ class InstOp(Enum): SMEM = 0x1 JUMP = 0x3 # branch taken JUMP_NO = 0x4 # branch not taken + CALL = 0x5 # s_call_b64 MESSAGE = 0x9 VALU_TRANS = 0xb # transcendental: exp, log, rcp, sqrt, sin, cos VALU_64_SHIFT = 0xd # 64-bit shifts: lshl, lshr, ashr @@ -72,8 +73,10 @@ class InstOp(Enum): # LDS ops on traced SIMD LDS_LOAD = 0x29 + LDS_ATOMIC = 0x2a # ds_append, ds_consume, ds_store_addtid_b32 LDS_STORE = 0x2b LDS_STORE_64 = 0x2c + LDS_STORE_96 = 0x2d LDS_STORE_128 = 0x2e # Memory ops on other SIMD (0x5x range) @@ -99,17 +102,27 @@ class InstOp(Enum): class InstOpRDNA4(Enum): """SQTT instruction operation types for RDNA4 (gfx1200). Different encoding from RDNA3.""" - # TODO: we need to do discovery of all of these from instructions SALU = 0x0 JUMP = 0x1 NEXT = 0x2 MESSAGE = 0x4 + VALU_TRANS = 0x5 VALU_64 = 0x6 + VALU_MAD64 = 0x7 + VINTERP = 0x9 VALU_WMMA = 0x46 VMEM = 0x10 VMEM_128 = 0x11 VMEM_STORE = 0x12 - VMEM_STORE_128 = 0x14 + VMEM_STORE_G96 = 0x13 # global_store_[b96,b128] + LDS_LOAD = 0x14 + LDS_STORE = 0x15 + LDS_STORE_64 = 0x16 + LDS_STORE_128 = 0x17 + VALU_F64 = 0x49 + SALU_TRANS = 0x4c # transcendental with sgpr src/dst + SALU_MUL = 0x4d # s_[mul,mulhi,mulk] + SALU_MUL64 = 0x4e OTHER_VMEM = 0x5e OTHER_VMEM_STORE = 0x60 @@ -147,11 +160,6 @@ class TS_DELTA_S8_W3(PacketType): delta = bits[10:8] _padding = bits[63:11] -class TS_DELTA_S8_W3_RDNA4(PacketType): # Layout 4: 64->72 bits - encoding = bits[6:0] == 0b0100001 - delta = bits[10:8] - _padding = bits[71:11] - class TS_DELTA_S5_W3(PacketType): encoding = bits[4:0] == 0b00110 delta = bits[7:5] @@ -363,7 +371,7 @@ PACKET_TYPES_RDNA3: dict[int, type[PacketType]] = { } PACKET_TYPES_RDNA4: dict[int, type[PacketType]] = { **PACKET_TYPES_RDNA3, - 7: TS_DELTA_S8_W3_RDNA4, 9: WAVESTART_RDNA4, 10: TS_DELTA_S5_W2_RDNA4, 11: WAVEALLOC_RDNA4, + 9: WAVESTART_RDNA4, 10: TS_DELTA_S5_W2_RDNA4, 11: WAVEALLOC_RDNA4, 12: TS_DELTA_S5_W3_RDNA4, 13: PERF_RDNA4, 22: TS_DELTA_OR_MARK_RDNA4, 24: INST_RDNA4, }