Download src/pax_kernel.fut from Snapkitty/pax-coder: direct link, hf CLI and curl.
- Browser
- Download file 1.77 kB
-
https://huggingface.co/Snapkitty/pax-coder/resolve/main/src/pax_kernel.fut
- Command line
-
hf download hf://Snapkitty/pax-coder/src/pax_kernel.fut
-
curl -L -o pax_kernel.fut https://huggingface.co/Snapkitty/pax-coder/resolve/main/src/pax_kernel.fut
1.77 kB
| -- PAX Futhark GEMM — functional specification for PAX PTX kernels | |
| -- Ahmad Ali Parr · PAX Architecture | |
| -- Functional correctness spec: pax_gemm_spec A B C == pax_gemm_impl A B C | |
| -- Matrix-matrix multiply: C = A × B + C₀ | |
| -- A: [m][k]f16, B: [k][n]f16, C₀: [m][n]f32 | |
| def gemm_fp16_f32 [m] [n] [k] | |
| (A : [m][k]f16) (B : [k][n]f16) (C0 : [m][n]f32) : [m][n]f32 = | |
| map2 (map2 (+)) C0 | |
| (map (\i -> | |
| map (\j -> | |
| f32.sum (map2 (\a b -> f16.to_f32 a * f16.to_f32 b) | |
| A[i] (map (\brow -> brow[j]) B))) | |
| (iota n)) | |
| (iota m)) | |
| -- Bias+GeLU epilogue functional spec | |
| def gelu_approx (x : f32) : f32 = | |
| let sqrt_2_pi : f32 = 0.7978845608f32 | |
| let coef : f32 = 0.044715f32 | |
| let inner = sqrt_2_pi * (x + coef * x * x * x) | |
| in 0.5f32 * x * (1.0f32 + f32.tanh inner) | |
| def bias_gelu [m] [n] (C : [m][n]f32) (bias : [n]f32) : [m][n]f32 = | |
| map (map2 (\c b -> gelu_approx (c + b)) bias) C | |
| -- Three-stage pipeline model: | |
| -- compute and memory ops interleaved in STAGES phases | |
| def pipeline_gemm [m] [n] [k] | |
| (A : [m][k]f16) (B : [k][n]f16) (stages : i64) : [m][n]f32 = | |
| let tile_k = k / stages | |
| in loop (acc : [m][n]f32) = replicate m (replicate n 0.0f32) | |
| for s in iota stages do | |
| let k_start = s * tile_k | |
| let A_tile = map (\row -> A[row, k_start : k_start + tile_k]) (iota m) | |
| let B_tile = map (\row -> B[row, :]) (iota tile_k) | |
| in map2 (map2 (+)) acc (gemm_fp16_f32 A_tile B_tile (replicate m (replicate n 0.0f32))) | |
| -- Entry point: full GEMM + bias + GeLU | |
| entry pax_gemm_bias_gelu [m] [n] [k] | |
| (A : [m][k]f16) (B : [k][n]f16) (bias : [n]f32) : [m][n]f32 = | |
| let C = gemm_fp16_f32 A B (replicate m (replicate n 0.0f32)) | |
| in bias_gelu C bias | |