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]>
302 lines
14 KiB
YAML
302 lines
14 KiB
YAML
name: wai-quantum WebGPU member
|
|
|
|
# The fabric's WebGPU member: one WGSL gate kernel, compiled for every adapter a
|
|
# runner has, certified against the CPU reference's pinned corpus digests. A
|
|
# second implementation, tile runs (the same kernel followed by apply_tile, which
|
|
# applies a run of gates tile by tile in one dispatch), is certified on its own
|
|
# against the same digests, on every adapter and in the browser.
|
|
#
|
|
# Each member job declares the adapters its runner must have in
|
|
# WAI_QUANTUM_WEBGPU_EXPECT. The device test fails if the adapters found differ,
|
|
# and scripts/wai-quantum-webgpu-member.sh fails unless all tests ran, every
|
|
# declared adapter earned one bit-exact certificate per pinned digest, and every
|
|
# declared adapter killed every shader mutant.
|
|
#
|
|
# The GPU jobs then run the quantum conformance corpus through each member
|
|
# (`wai_quantum_vectors verify --webgpu`). wai-rs is built there with
|
|
# --no-default-features: its default feature, `codecs`, links system codec
|
|
# libraries that neither GPU host has, and the corpus needs none of them.
|
|
#
|
|
# The browser job runs the same kernel through a browser's WebGPU, compiled by the
|
|
# browser's own WGSL compiler: wai-web's `quantum_webgpu` bundle in a headless page
|
|
# (wai/quantum-conformance/browser_webgpu.mjs), which must certify a GPU member with
|
|
# the four pinned digests, reproduce every vector and refuse every reject file with
|
|
# its class. It is not a required status until it has been green three runs in a row.
|
|
#
|
|
# There is no windows job while the windows runner is offline: a job queued on an
|
|
# offline runner never settles. Add it back from the comment at the end when the
|
|
# runner has survived a reboot.
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- 'wai/wai-quantum/**'
|
|
- 'wai/quantum-conformance/**'
|
|
- 'wai/tools/quantum-wgsl-check/**'
|
|
- 'wai/wai-rs/src/bin/wai_quantum_vectors.rs'
|
|
# The GPU jobs build wai-rs with the forwarded feature, --locked.
|
|
- 'wai/wai-rs/Cargo.toml'
|
|
- 'wai/wai-rs/Cargo.lock'
|
|
- 'wai/wai-rs/src/lib.rs'
|
|
- 'rust-toolchain.toml'
|
|
# The checks and browser jobs build wai-web with its feature, --locked.
|
|
- 'wai/wai-web/Cargo.toml'
|
|
- 'wai/wai-web/Cargo.lock'
|
|
- 'wai/wai-web/src/quantum_webgpu.rs'
|
|
- 'wai/wai-web/src/lib.rs'
|
|
- 'wai/wai-web/demo/quantum_webgpu*'
|
|
- 'scripts/wai-quantum-webgpu-member.sh'
|
|
- '.github/workflows/wai-quantum-webgpu.yml'
|
|
pull_request:
|
|
paths:
|
|
- 'wai/wai-quantum/**'
|
|
- 'wai/quantum-conformance/**'
|
|
- 'wai/tools/quantum-wgsl-check/**'
|
|
- 'wai/wai-rs/src/bin/wai_quantum_vectors.rs'
|
|
# The GPU jobs build wai-rs with the forwarded feature, --locked.
|
|
- 'wai/wai-rs/Cargo.toml'
|
|
- 'wai/wai-rs/Cargo.lock'
|
|
- 'wai/wai-rs/src/lib.rs'
|
|
- 'rust-toolchain.toml'
|
|
# The checks and browser jobs build wai-web with its feature, --locked.
|
|
- 'wai/wai-web/Cargo.toml'
|
|
- 'wai/wai-web/Cargo.lock'
|
|
- 'wai/wai-web/src/quantum_webgpu.rs'
|
|
- 'wai/wai-web/src/lib.rs'
|
|
- 'wai/wai-web/demo/quantum_webgpu*'
|
|
- 'scripts/wai-quantum-webgpu-member.sh'
|
|
- '.github/workflows/wai-quantum-webgpu.yml'
|
|
|
|
jobs:
|
|
checks:
|
|
name: shader checks · browser build · wasip2 inertness · MSRV
|
|
runs-on: linux
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- name: Install Rust 1.98.0 (wasm32 targets) and 1.97.0
|
|
shell: bash
|
|
run: |
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
command -v rustup >/dev/null 2>&1 || \
|
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.98.0
|
|
rustup toolchain install 1.98.0 --profile minimal
|
|
rustup toolchain install 1.97.0 --profile minimal
|
|
rustup default 1.98.0
|
|
rustup target add --toolchain 1.98.0 wasm32-unknown-unknown wasm32-wasip2
|
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
- name: SPIR-V validator
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo"
|
|
$SUDO apt-get update -qq
|
|
$SUDO apt-get install -y -qq --no-install-recommends spirv-tools
|
|
- name: The shaders under naga 30.0.1
|
|
shell: bash
|
|
working-directory: wai/tools/quantum-wgsl-check
|
|
run: |
|
|
set -euo pipefail
|
|
cargo run --locked --release -- "$RUNNER_TEMP" 2>&1 | tee "$RUNNER_TEMP/wgsl-check.log"
|
|
grep -qx "quantum-wgsl-check: ok" "$RUNNER_TEMP/wgsl-check.log"
|
|
spirv-val --target-env vulkan1.1 "$RUNNER_TEMP/lanes32.spv"
|
|
spirv-val --target-env vulkan1.1 "$RUNNER_TEMP/lanes32_tile.spv"
|
|
- name: The member builds for a browser
|
|
working-directory: wai/wai-quantum
|
|
run: cargo build --locked --lib --target wasm32-unknown-unknown --no-default-features --features quantum_fabric_webgpu
|
|
- name: The browser bundle builds with the member
|
|
working-directory: wai/wai-web
|
|
run: cargo build --locked --release --target wasm32-unknown-unknown --features quantum_webgpu
|
|
- name: On wasm32-wasip2 the feature is inert
|
|
shell: bash
|
|
working-directory: wai/wai-quantum
|
|
run: |
|
|
set -euo pipefail
|
|
cargo check --locked --lib --target wasm32-wasip2 --features full,quantum_fabric_webgpu
|
|
w="$RUNNER_TEMP/tree-wasip2.txt"; n="$RUNNER_TEMP/tree-native.txt"
|
|
cargo tree --locked --target wasm32-wasip2 --features full,quantum_fabric_webgpu -e normal --prefix none > "$w"
|
|
cargo tree --locked --target x86_64-unknown-linux-gnu --features quantum_fabric_webgpu -e normal --prefix none > "$n"
|
|
grep -q '^wai-quantum ' "$w" || { echo "::error::cargo tree printed no wasip2 tree"; exit 1; }
|
|
grep -q '^wgpu ' "$n" || { echo "::error::the native tree has no wgpu, so this check cannot see it"; exit 1; }
|
|
if grep -q '^wgpu' "$w"; then echo "::error::wgpu is in the wasm32-wasip2 tree"; exit 1; fi
|
|
- name: The package carries the shader
|
|
shell: bash
|
|
working-directory: wai/wai-quantum
|
|
run: |
|
|
set -euo pipefail
|
|
cargo package --locked --list --allow-dirty > "$RUNNER_TEMP/package.txt"
|
|
grep -qx 'src/quantum_fabric/lanes32.wgsl' "$RUNNER_TEMP/package.txt"
|
|
grep -qx 'src/quantum_fabric/lanes32_tile.wgsl' "$RUNNER_TEMP/package.txt"
|
|
- name: MSRV 1.97.0
|
|
working-directory: wai/wai-quantum
|
|
run: cargo +1.97.0 check --locked --lib --features quantum_fabric_webgpu
|
|
# The member's unit tests need no GPU (a failed native wait is fed to the
|
|
# guard as a panicking closure), and only the feature build compiles them.
|
|
- name: The member's unit tests, without a device
|
|
shell: bash
|
|
working-directory: wai/wai-quantum
|
|
run: |
|
|
set -euo pipefail
|
|
cargo test --locked --lib --features quantum_fabric_webgpu -- quantum_fabric_webgpu:: 2>&1 \
|
|
| tee "$RUNNER_TEMP/member-unit.log"
|
|
grep -q '^test quantum_fabric_webgpu::tests::a_failed_native_wait_is_a_typed_loss \.\.\. ok$' \
|
|
"$RUNNER_TEMP/member-unit.log" \
|
|
|| { echo "::error::the member's unit test did not run"; exit 1; }
|
|
|
|
member-software:
|
|
name: member · software Vulkan (linux)
|
|
runs-on: linux
|
|
timeout-minutes: 120
|
|
env:
|
|
WAI_QUANTUM_WEBGPU_EXPECT: swgpu-vulkan-10005
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- name: Install Rust 1.98.0
|
|
shell: bash
|
|
run: |
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
command -v rustup >/dev/null 2>&1 || \
|
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.98.0
|
|
rustup toolchain install 1.98.0 --profile minimal
|
|
rustup default 1.98.0
|
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
- name: The Vulkan loader and a software Vulkan driver
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo"
|
|
$SUDO apt-get update -qq
|
|
$SUDO apt-get install -y -qq --no-install-recommends libvulkan1 mesa-vulkan-drivers
|
|
- name: The member's tests
|
|
shell: bash
|
|
run: scripts/wai-quantum-webgpu-member.sh
|
|
|
|
member-metal:
|
|
name: member · Metal (macos)
|
|
runs-on: macos
|
|
timeout-minutes: 90
|
|
env:
|
|
WAI_QUANTUM_WEBGPU_EXPECT: gpu-metal-0
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
# launchd's PATH omits cargo on the macOS host runner.
|
|
- name: Put cargo on PATH
|
|
shell: bash
|
|
run: echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
- name: The member's tests
|
|
shell: bash
|
|
run: nice -n 10 scripts/wai-quantum-webgpu-member.sh
|
|
- name: The conformance corpus through the member
|
|
shell: bash
|
|
working-directory: wai/wai-rs
|
|
run: nice -n 10 cargo run --locked --no-default-features --features quantum_fabric_webgpu --bin wai_quantum_vectors -- verify ../quantum-conformance --webgpu
|
|
|
|
member-hw:
|
|
name: member · discrete GPU, Vulkan (jetson-hub)
|
|
runs-on: linux-hw
|
|
timeout-minutes: 150
|
|
env:
|
|
# Set from the key list the first run prints; add any other ICD the host
|
|
# exposes (an integrated GPU, a software driver) as it reports them.
|
|
# The discrete GPU, and the software Vulkan driver the host also has. The wide
|
|
# sizes run on the GPU only.
|
|
WAI_QUANTUM_WEBGPU_EXPECT: gpu-vulkan-10de,swgpu-vulkan-10005
|
|
WAI_QUANTUM_WEBGPU_WIDE: '1'
|
|
CARGO_PROFILE_DEV_DEBUG: '0'
|
|
CARGO_BUILD_JOBS: '8'
|
|
steps:
|
|
- name: Fetch the source
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
want="${{ github.event.pull_request.head.sha || github.sha }}"
|
|
rm -rf src && mkdir src && cd src
|
|
git init -q
|
|
# Fetch the commit itself, not the ref: a later commit on the ref that this
|
|
# workflow's paths do not match would otherwise be fetched instead.
|
|
git fetch -q --depth 1 http://100.64.224.0:3400/Transaction-Science/open-standards.git "$want"
|
|
git checkout -q FETCH_HEAD
|
|
got="$(git rev-parse HEAD)"
|
|
[ "$got" = "$want" ] || { echo "::error::fetched $got, not $want"; exit 1; }
|
|
- name: The member's tests
|
|
shell: bash
|
|
working-directory: src
|
|
run: CARGO_TARGET_DIR="$HOME/hw-target/wai-quantum" nice -n 10 scripts/wai-quantum-webgpu-member.sh
|
|
- name: The conformance corpus through the member
|
|
shell: bash
|
|
working-directory: src/wai/wai-rs
|
|
run: CARGO_TARGET_DIR="$HOME/hw-target/wai-rs" nice -n 10 cargo run --locked --no-default-features --features quantum_fabric_webgpu --bin wai_quantum_vectors -- verify ../quantum-conformance --webgpu
|
|
|
|
browser:
|
|
name: member · browser WebGPU (macos)
|
|
runs-on: macos
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
# launchd's PATH omits cargo on the macOS host runner.
|
|
- name: Put cargo on PATH
|
|
shell: bash
|
|
run: echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
# The page's file is held to the crate by wai-quantum's tests/fabric_expected.rs:
|
|
# exactly the four certificates of the pinned corpora (gateset, corpus, seed,
|
|
# cases, wide circuits and the digest the CPU computes) and both implementation
|
|
# ids. Editing the file alone, say giving fabric-v1 random-v1's digests so that
|
|
# no circuit wider than one tile runs, fails here.
|
|
- name: The page's pins are the crate's
|
|
shell: bash
|
|
working-directory: wai/wai-quantum
|
|
run: |
|
|
set -euo pipefail
|
|
nice -n 10 cargo test --locked --features quantum_fabric --test fabric_expected 2>&1 | tee "$RUNNER_TEMP/fabric-expected.log"
|
|
grep -q '^test the_browser_legs_pins_are_the_crates \.\.\. ok$' "$RUNNER_TEMP/fabric-expected.log" \
|
|
|| { echo "::error::the pins test did not run"; exit 1; }
|
|
# Pinned to the wasm-bindgen version in wai-web/Cargo.lock: the CLI and the crate
|
|
# must match exactly.
|
|
- name: wasm-bindgen CLI 0.2.127
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
rustup target add wasm32-unknown-unknown
|
|
cargo install --locked wasm-bindgen-cli --version 0.2.127
|
|
- name: The member's bundle
|
|
shell: bash
|
|
working-directory: wai/wai-web
|
|
run: |
|
|
set -euo pipefail
|
|
nice -n 10 cargo build --locked --release --target wasm32-unknown-unknown --features quantum_webgpu
|
|
wasm-bindgen --target web --out-dir demo/pkg-webgpu --out-name wai_quantum_webgpu \
|
|
target/wasm32-unknown-unknown/release/wai_web.wasm
|
|
# Playwright and its headless browser go into the job's temporary directory, not
|
|
# the host's caches. `chromium` is Playwright's name for its engine.
|
|
- name: Playwright 1.60.0 and its headless browser
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
node --version
|
|
pw="$RUNNER_TEMP/playwright"
|
|
mkdir -p "$pw"
|
|
npm install --prefix "$pw" --no-save --no-audit --no-fund [email protected]
|
|
PLAYWRIGHT_BROWSERS_PATH="$pw/browsers" "$pw/node_modules/.bin/playwright" install --only-shell chromium
|
|
echo "PLAYWRIGHT_HOST=$pw/" >> "$GITHUB_ENV"
|
|
echo "PLAYWRIGHT_BROWSERS_PATH=$pw/browsers" >> "$GITHUB_ENV"
|
|
- name: The member in a browser
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
WAI_QUANTUM_WEBGPU_REQUIRE=1 nice -n 10 node wai/quantum-conformance/browser_webgpu.mjs 2>&1 \
|
|
| tee "$RUNNER_TEMP/browser-webgpu.log"
|
|
grep -qE '^browser webgpu: member=local/gpu-webgpu-[0-9a-f]{12} class=gpu certified bit-exact 4 of 4; tiles certified bit-exact 4 of 4; ' \
|
|
"$RUNNER_TEMP/browser-webgpu.log" \
|
|
|| { echo "::error::no GPU member certified bit-exact 4 of 4, per-gate and in tile runs, in the browser"; exit 1; }
|
|
|
|
# Windows, when its runner is back (DX12, translator naga+dxbc, and Vulkan, as separate members):
|
|
# member-windows:
|
|
# runs-on: windows
|
|
# env: { WAI_QUANTUM_WEBGPU_EXPECT: "<keys from the first run>" }
|
|
# steps: checkout; Set-ExecutionPolicy Bypass; run the script with `shell: bash`
|
|
# (Git Bash on PATH). Not a required status.
|