From an independent review of the tile implementation (no input gave wrong bits); each finding fixed: - expected.json is authoritative: tests/fabric_expected.rs (excluded from the package, so publishing is unaffected; cargo drops its target and verification builds the library only) requires quantum-conformance/fabric/expected.json to be exactly the four certificates of the pinned corpora (gateset, corpus, seed, cases, wide circuits, the digest the CPU computes) and both implementation ids; a missing file fails. The browser job runs it in place of the grep step, whose comment now says what is checked. A copy giving fabric-v1 random-v1's digests fails it. - The checker's step 6 adds a uniformity taint check: a barrier must not sit under a condition, or after a return, break or continue under a condition, that depends on the invocation's ids or on memory other invocations write (read-write storage, workgroup memory, atomics), directly or through a variable or a call. Uniform buffers, read-only storage, buffer lengths and the workgroup id, count and size are uniform. Planted early returns on local_invocation_index (the reviewer's variant among them), on a read-write load, through a variable and through a call each fail; the real shaders pass. - The tile kernel refuses a run record (bit 4, nothing touched) unless its tiles cover each state plane exactly and its grid (num_workgroups, one deep) holds every tile once with x_groups to a row. The tile implementation id is now wgsl-lanes32-tile/54e443520c020013, re-pinned in wgsl.rs and expected.json. - PlannedGate::is_well_formed: diag must match the words and the op index must not be u32::MAX (the tile kernel's "no op"). plan::execute_from returns None and the member refuses Internal(4) otherwise; compile never makes either. - The member splits a tile step into dispatches of at most SUBMIT_BUDGET pair-updates (splitting a run is exact), so every submission keeps the budget the module and POLL_TIMEOUT documents state. - g12 adds, for the tile member: starts other than zero; a first out-of-range op in a later submission with circuit/1 P(19) as filler (never skipped); a 600-gate run at 20 qubits that the member splits; ill-formed planned gates refused by both implementations; and, inside WAI_QUANTUM_WEBGPU_WIDE only, the widest sizes (run cap 16, grid (8, 8192) at 26 qubits), which the member script then requires. - Placement's tie order is documented as it is: with both implementations' entries for one member and no energy figures, place picks the tile implementation (its name sorts first); discovery opens per-gate members, which are the fallback. A test pins the order. - wai/wai-web/src/lib.rs is in the workflow's paths; the wasip2 job requires the new unit test by name. Co-Authored-By: Claude Opus 5.5 <[email protected]>
57 lines
3.4 KiB
Shell
Executable file
57 lines
3.4 KiB
Shell
Executable file
#!/usr/bin/env bash
|
|
#
|
|
# wai-quantum-webgpu-member.sh
|
|
#
|
|
# Runs the WebGPU member's device tests and fails unless (1) all 13 of them ran
|
|
# and passed, (2) the adapters found are exactly WAI_QUANTUM_WEBGPU_EXPECT, (3) each
|
|
# declared adapter earned one bit-exact certificate per pinned corpus digest under
|
|
# each implementation (the per-gate kernel, wgsl-lanes32/, and tile runs,
|
|
# wgsl-lanes32-tile/), and (4) each declared adapter killed every shader mutant of
|
|
# both. These checks are what make a filtered, skipped or adapter-less run fail
|
|
# instead of pass.
|
|
#
|
|
# WAI_QUANTUM_WEBGPU_EXPECT=<key[,key...]|none> [WAI_QUANTUM_WEBGPU_WIDE=1] \
|
|
# scripts/wai-quantum-webgpu-member.sh
|
|
set -euo pipefail
|
|
: "${WAI_QUANTUM_WEBGPU_EXPECT:?declare the adapter keys this runner must have, or none}"
|
|
cd "$(dirname "$0")/../wai/wai-quantum"
|
|
dir="${RUNNER_TEMP:-$(mktemp -d)}"
|
|
log="$dir/webgpu-member.log"
|
|
export WAI_QUANTUM_WEBGPU_REPORT="$dir/webgpu-member.report"
|
|
: > "$WAI_QUANTUM_WEBGPU_REPORT"
|
|
|
|
cargo test --locked --features quantum_fabric_webgpu --test webgpu_member \
|
|
-- --nocapture --test-threads=1 2>&1 | tee "$log"
|
|
|
|
grep -q "test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out" "$log" \
|
|
|| { echo "::error::the member's 13 tests did not all run and pass"; exit 1; }
|
|
grep -qxF "webgpu adapters: as declared ($WAI_QUANTUM_WEBGPU_EXPECT)" "$WAI_QUANTUM_WEBGPU_REPORT" \
|
|
|| { echo "::error::the adapters found are not the declared set"; exit 1; }
|
|
|
|
[ "$WAI_QUANTUM_WEBGPU_EXPECT" = none ] && exit 0
|
|
pins=(
|
|
"wai.quantum.circuit/apply random-v1 d18454c639acfd9c7b66450f4ded1aac4ab46cc10a7bedbcf4958a96e204fb36"
|
|
"wai.quantum.circuit2/apply random-v1 3dbde276c1095bf827faec71d5980e050f8a55a5ba7d97cd3bbdaec3f43a13b2"
|
|
"wai.quantum.circuit/apply fabric-v1 41c726a0ac80f7defef92e15ecf893bdb7a3076b5e7f670fa0b7142e5c033df7"
|
|
"wai.quantum.circuit2/apply fabric-v1 9a84b55af68f1a8b07390b234cf562dd8d85cef3185a697ab85690c8790a7809"
|
|
)
|
|
for key in $(tr ',' '\n' <<<"$WAI_QUANTUM_WEBGPU_EXPECT" | sort -u); do
|
|
want=$(tr ',' '\n' <<<"$WAI_QUANTUM_WEBGPU_EXPECT" | grep -cxF "$key")
|
|
for p in "${pins[@]}"; do
|
|
set -- $p
|
|
for implementation in wgsl-lanes32 wgsl-lanes32-tile; do
|
|
n=$(grep -cE "^webgpu certified: key=$key member=local/[a-z]+-[a-z0-9]+-[0-9a-f]{12} kernel=$1 corpus=$2 implementation=$implementation/[0-9a-f]{16} parity=bit-exact cases=[0-9]+ digest=$3$" "$WAI_QUANTUM_WEBGPU_REPORT" || true)
|
|
[ "$n" -eq "$want" ] || { echo "::error::$key: $n bit-exact $2 certificates for $1 under $implementation, $want expected"; exit 1; }
|
|
done
|
|
done
|
|
n=$(grep -cxF "webgpu mutants: key=$key killed 7 of 7" "$WAI_QUANTUM_WEBGPU_REPORT" || true)
|
|
[ "$n" -eq "$want" ] || { echo "::error::$key: a mutant survived, or the mutant test did not run"; exit 1; }
|
|
n=$(grep -cxF "webgpu tile mutants: key=$key killed 3 of 3" "$WAI_QUANTUM_WEBGPU_REPORT" || true)
|
|
[ "$n" -eq "$want" ] || { echo "::error::$key: a tile mutant survived, or the mutant test did not run"; exit 1; }
|
|
if [ "${WAI_QUANTUM_WEBGPU_WIDE:-0}" = 1 ] && [ "${key%%-*}" = gpu ]; then
|
|
grep -qE "^webgpu wide: key=$key n=2[56] matches native$" "$WAI_QUANTUM_WEBGPU_REPORT" \
|
|
|| { echo "::error::$key: no wide run at the member's full size"; exit 1; }
|
|
grep -qE "^webgpu tile wide: key=$key n=2[56] matches native$" "$WAI_QUANTUM_WEBGPU_REPORT" \
|
|
|| { echo "::error::$key: no wide tile run at the member's full size"; exit 1; }
|
|
fi
|
|
done
|