custom
code
sovereign-compute
pax-coder / PAX /WMMA.lean
SNAPKITTYWEST's picture
chore: push pax-coder from SNAPKITTYWEST GitHub
ef6eb55 verified
Raw
History Blame Contribute Delete
1.52 kB
-- PAX WMMA — mma.sync.aligned.m16n8k8 FP16→FP32 semantics
-- Ahmad Ali Parr · PAX Architecture · sm_86
-- Proof obligation PO3: SIMT divergence reconvergence
namespace PAX.WMMA
/-- Abstract matrix tile: m×n×k WMMA fragment -/
structure WMMAFragment (m n k : ℕ) (α β : Type*) where
aFrag : Fin m → Fin k → α -- A matrix (FP16)
bFrag : Fin k → Fin n → α -- B matrix (FP16)
cFrag : Fin m → Fin n → β -- accumulator (FP32)
/-- Functional GEMM spec: C += A × B -/
def gemmSpec [Add β] [Mul α] [HMul α α β] [Zero β]
{m n k : ℕ} (frag : WMMAFragment m n k α β) : Fin m → Fin n → β :=
fun i j =>
frag.cFrag i j +
Finset.univ.sum (fun (l : Fin k) => frag.aFrag i l * frag.bFrag l j)
/-- mma.sync abstract model — 32-thread warp computes 16×8 tile -/
structure MMASyncResult (m n : ℕ) (β : Type*) where
result : Fin m → Fin n → β
/-- PO3: mma.sync result equals functional spec -/
axiom mma_sync_correct [Add β] [Mul Float Float] [HMul Float Float β] [Zero β]
{m n k : ℕ} (frag : WMMAFragment m n k Float β) :
∀ i j, (mmaSync frag).result i j = gemmSpec frag i j
/-- warp_gemm: issue mma.sync, accumulate 8 tiles per warp -/
def warpGEMM [Add β] [Mul Float Float] [HMul Float Float β] [Zero β]
{tiles : ℕ} (frags : Fin tiles → WMMAFragment 16 8 8 Float β) :
Fin 16 → Fin 8 → β :=
fun i j =>
Finset.univ.sum (fun t => (mmaSync (frags t)).result i j)
end PAX.WMMA