gem/tests/fused_split_kv_resources_analysis.sh
2026-08-30 18:24:55 -06:00

60 lines
2.7 KiB
Bash
Executable file

#!/bin/sh
set -eu
[ "$#" -eq 1 ] || { echo "usage: $0 ANALYZER" >&2; exit 2; }
analyzer=$1
fixture=$(mktemp -d /private/tmp/gem-fused-split-kv-resources.XXXXXX)
trap 'rm -rf "$fixture"' EXIT INT TERM HUP
jq -n '{
schema_version:1, engine:"gem-native-c-metal",
workload:"d512-fused-split-kv-resource-receipt",
device:{name:"Apple M4 Max",apple_gpu_family9:true,max_threadgroup_memory_bytes:32768},
geometry:{query_heads:32,kv_heads:4,heads_per_kv:8,head_dimension:512,
value_dimension:512,partitions:32,tile_tokens:4,threads_per_threadgroup:256,
simdgroups_per_threadgroup:8,kv_type:"f32",window:0},
scratch:{maximum_bytes:4096,denominator_bytes:4096,numerator_bytes:2097152,
total_bytes:2105344},
first_pass_pipeline_resources:{thread_execution_width:32,
max_total_threads_per_threadgroup:1024,static_threadgroup_memory_bytes:0,
dynamic_threadgroup_memory_bytes:16384,threads_per_threadgroup:256},
reducer_pipeline_resources:{thread_execution_width:32,
max_total_threads_per_threadgroup:1024,static_threadgroup_memory_bytes:0,
dynamic_threadgroup_memory_bytes:0,threads_per_threadgroup:256},
metal_source_sha256:("a" * 64),native_binary_sha256:("b" * 64)
}' > "$fixture/receipt.json"
"$analyzer" "$fixture/receipt.json" "$fixture/analysis.json"
jq -e '
.workload == "d512-fused-split-kv-resource-analysis" and
.compiled_resources.first_pass.total_threadgroup_memory_bytes == 16384 and
.compiled_resources.first_pass.threadgroup_memory_limit_utilization_pct == 50 and
.scratch.total_bytes == 2105344 and .screening.passed == true and
.screening.promotion_eligible == false and
(.input.sha256 | test("^[0-9a-f]{64}$"))
' "$fixture/analysis.json" >/dev/null
jq '.geometry.tile_tokens = 8 | .first_pass_pipeline_resources.dynamic_threadgroup_memory_bytes = 32768' \
"$fixture/receipt.json" > "$fixture/bad-tile.json"
if "$analyzer" "$fixture/bad-tile.json" >/dev/null 2>&1; then
echo "fused split-KV resource analyzer accepted tile8" >&2
exit 1
fi
jq '.scratch.total_bytes -= 4096' "$fixture/receipt.json" > "$fixture/bad-scratch.json"
if "$analyzer" "$fixture/bad-scratch.json" >/dev/null 2>&1; then
echo "fused split-KV resource analyzer accepted inconsistent scratch" >&2
exit 1
fi
jq '.first_pass_pipeline_resources.max_total_threads_per_threadgroup = 128' \
"$fixture/receipt.json" > "$fixture/bad-threads.json"
if "$analyzer" "$fixture/bad-threads.json" >/dev/null 2>&1; then
echo "fused split-KV resource analyzer accepted an unlaunchable pipeline" >&2
exit 1
fi
if "$analyzer" "$fixture/receipt.json" "$fixture/analysis.json" >/dev/null 2>&1; then
echo "fused split-KV resource analyzer overwrote an existing analysis" >&2
exit 1
fi