Approved by the owner on 2026-10-22. Procedure: change `channel`, run `rustup show`, then run the pipeline. What changed - rust-toolchain.toml and eoc/eoc-rs/rust-toolchain.toml: channel "1.98.0" becomes "1.99.1". These are the only two pins in the tree, and the root one governs every other cargo root. - 64 workflows under .github/workflows (the forge's CI): every `Install Rust 1.98.0`, `rustup toolchain install / default / component add / target add --toolchain 1.98.0` and `--default-toolchain 1.98.0` now names 1.99.1 (409 lines). Two of those lines are in build steps rather than install steps (wai-conformance.yml's two `wasm32 (unix)` steps each `rustup target add --toolchain`), and they move with the rest: a target added to a toolchain that is not installed is an error. - Left as they are, because they record what was measured on 1.98.0: standards-build.yml's "Verified on a native arm64 Linux container (rustc 1.98.0)", wai-conformance.yml's note on Rust 1.98's LLD 22, and the "rustc 1.98.0 (example)" strings in receipts, vectors and docs. The one-codegen-unit workaround that note explains also stays. 1.99.1 ships LLD 23.1.1, which the note says links those inputs, but removing the workaround should wait for a run at the CI path on x86_64. Why - 1.98.0 has a P-critical miscompile, rust-lang/rust#161441 (I-miscompile, regression-from-stable-to-stable). rustc emits a vacant (null) method slot in a trait-object vtable, so a safe dynamic call jumps to address zero (undefined behaviour). RELEASES.md records the fix in 1.98.1 ("rustc: fix miscompilation in generating vtables"). - 1.99.1 is the current stable (channel manifest dated 2026-10-15; rustc 58cf8f9c3 2026-10-13). It also fixes 1.99.0's own regressions: wcslen on UEFI and embedded targets, x86_64 FFI `bool` returns, and the rust-lld rpath on macOS. Evidence All of it ran on the build host ([email protected], aarch64-apple-darwin) through ~/kani-logs/remote/rb. Nothing was built on the dev Mac. - `rustup show`: the active toolchain is 1.99.1-aarch64-apple-darwin, "overridden by .../rust-toolchain.toml" (and by eoc/eoc-rs's own file there). rustc 1.99.1 (58cf8f9c3 2026-10-13), LLVM 23.1.1, clippy 0.1.99, rustfmt 1.10.0. The baseline is rustc 1.98.0 (88d9e12ae 2026-08-18). - Scope: every cargo root the pin governs, which is 46 of the 49 tracked lockfiles. The other three: two are vendored crates that resolve inside their parents, and wai/wai-rs/fuzz builds on its own pinned nightly. - Trees. The final tree is main at96117c570plus these two commits. Main moved four times while this ran, and each root's evidence comes from the newest tree it was run on: - 13 roots on the final tree: every root main changed after1a465f23d, and every root that consumes such a crate by path. - 12 roots on1a465f23dplus these two commits. - 7 roots onb16816671plus these two commits. - 14 roots onaa61ab3b9plus the pin change. For each root in the last three groups, checked with git diff and the lockfiles' path packages: none of its files, and no crate it reaches by path, differs on the final tree. - Each root got: (a) `cargo fmt --all -- --check` on the pin and on 1.98.0. The output is byte-identical in all 46. CI gates no root on rustfmt, and none is rustfmt-clean on main. (b) `cargo clippy --locked --keep-going --workspace --all-targets` on both toolchains, with the diagnostics compared line by line. After the previous commit, no root has a diagnostic that only 1.99.1 reports. openpay's one differing line is the same lint at the same site, reworded. (c) `cargo test --workspace --locked`. (d) the root's other CI steps that can run on this host: feature-gated tests, conformance suites, release-profile tests, the aac page-set checks, and every clippy -D warnings gate. The gates are standards-build's macOS meter and omni lints (jouleclaw-energy x2, jouleclaw-omni metal, jouleclaw-loader-gguf, jcp, proof, eoc, sandbox), wai-pack, wai-quantum-cli (default, no-default and metal), wai-quantum-service, wai-quantum-qpu and wai-quantum-desktop. - Totals: `cargo test --workspace` ran in 43 roots: 12,532 passed, 1 failed, 101 ignored. The other 3 roots are wasm32-only, and their `cargo build --release --target wasm32-unknown-unknown` passed. Every other CI step passed (62 of 62). - On the final tree: scripts/check-lockfiles.sh (cargo 1.99.1) found all 47 lockfiles current, and scripts/check-advisories.py passes. - tokio is 1.54.1 in every lockfile cargo reads. That is patched for both RUSTSEC-2026-0386 (>= 1.53.3) and RUSTSEC-2026-0384 (>= 1.54.1). The 1.53.1 in vendor/wtransport/Cargo.lock is the upstream file kept with the vendored source; cargo resolves wtransport inside its parents, and both gates skip that file. - What is not green, each one reproduced on 1.98.0: - wai-ops-gpu: under the debug profile, `corpus` trips the debug_assert at exec.rs:187 on both toolchains. CI runs it in release only, and that passes (6/6). - wai-ops: clippy::derived_hash_with_manual_eq (deny-by-default) on both toolchains. No CI job runs clippy there. - wai-vector/wasm: `--all-targets` cannot build the lib-test target (its own `panic_impl`) on either toolchain. `clippy --lib` for wasm32 reports 0 diagnostics on both. - eoc-cascade's hit_calibration_process_energy test reads real energy counters, and it fails some of the time on the loaded shared host. In interleaved runs each toolchain passed 18 of 20. The full eoc-rs suite passed on the final tree (741 passed). - Environment, not code: - wai-quantum-desktop embeds the Studio's build, so wai/quantum-studio was built first (`npm ci`, `node build.mjs`), as CI does. - Not covered here: the x86_64 and arm64 Linux and Windows legs; the GPU, NPU, FPGA, emulator and hardware-meter legs; wasm32 tests under Node, wasmtime and wasip2; and the fuzz job. Co-Authored-By: Claude Opus 5.5 <[email protected]>
455 lines
22 KiB
YAML
455 lines
22 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 no GPU host has, and the corpus needs none of them. The GPU
|
|
# hosts: jetson-hub (a discrete and an integrated GPU) and framework-128gb (an
|
|
# integrated GPU).
|
|
#
|
|
# 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.
|
|
#
|
|
# The meter (wai/tools/quantum-meter) is wai-quantum's RunMeter over a process's own
|
|
# CPU and GPU energy counters. On the Metal host, where those counters exist, it meters
|
|
# a member's runs and the CPU reference's over windows they resolve, and its test must
|
|
# print what it read; on the software Vulkan host, where they do not, every window must
|
|
# come out unmetered.
|
|
#
|
|
# 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:
|
|
pull_request:
|
|
paths:
|
|
- 'wai/wai-quantum/**'
|
|
- 'wai/quantum-conformance/**'
|
|
- 'wai/tools/quantum-wgsl-check/**'
|
|
# The meter, and the counters it reads.
|
|
- 'wai/tools/quantum-meter/**'
|
|
- 'jouleclaw/jouleclaw-rs/Cargo.toml'
|
|
- 'jouleclaw/jouleclaw-rs/crates/jouleclaw-core/**'
|
|
- 'jouleclaw/jouleclaw-rs/crates/jouleclaw-energy/**'
|
|
- 'wai/wai-rs/src/bin/wai_quantum_vectors.rs'
|
|
# The GPU jobs build wai-rs with the forwarded feature, --locked.
|
|
- 'wai/wai-rs/Cargo.lock'
|
|
- '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'
|
|
schedule:
|
|
- cron: '6 7 * * *'
|
|
|
|
jobs:
|
|
# Does this pull request's own diff touch the paths below? This forge matches a
|
|
# workflow's `paths:` against the push, so a merge of main into a branch fires the
|
|
# workflow whatever the pull request changes; every job here waits on this answer.
|
|
# A push to main, a schedule, or anything the script cannot determine answers
|
|
# `true` (scripts/pr-touches-paths.py).
|
|
relevant:
|
|
name: does this change touch it
|
|
runs-on: linux
|
|
outputs:
|
|
run: ${{ steps.gate.outputs.run }}
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
fetch-depth: 0
|
|
- id: gate
|
|
run: |
|
|
set -euo pipefail
|
|
r=$(python3 scripts/pr-touches-paths.py .github/workflows/wai-quantum-webgpu.yml \
|
|
"${{ github.event.pull_request.base.sha }}" \
|
|
"${{ github.event.pull_request.head.sha }}")
|
|
echo "this change touches wai-quantum-webgpu: $r"
|
|
echo "run=$r" >> "$GITHUB_OUTPUT"
|
|
|
|
checks:
|
|
needs: relevant
|
|
if: needs.relevant.outputs.run == 'true'
|
|
name: shader checks · browser build · wasip2 inertness
|
|
runs-on: linux
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- name: Install Rust 1.99.1 (wasm32 targets)
|
|
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.99.1
|
|
rustup toolchain install 1.99.1 --profile minimal
|
|
rustup default 1.99.1
|
|
rustup target add --toolchain 1.99.1 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"
|
|
# 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:
|
|
needs: relevant
|
|
if: needs.relevant.outputs.run == 'true'
|
|
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.99.1
|
|
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.99.1
|
|
rustup toolchain install 1.99.1 --profile minimal
|
|
rustup default 1.99.1
|
|
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
|
|
# No per-process energy counter exists here: the meter must find none, and a
|
|
# run of the member through it must be unmetered.
|
|
- name: The meter, where its counters do not exist
|
|
shell: bash
|
|
working-directory: wai/tools/quantum-meter
|
|
run: |
|
|
set -euo pipefail
|
|
cargo test --locked -- --nocapture 2>&1 | tee "$RUNNER_TEMP/meter.log"
|
|
grep -q '^test a_members_runs_are_metered_over_a_window_the_counters_resolve \.\.\. ok$' "$RUNNER_TEMP/meter.log" \
|
|
|| { echo "::error::the meter's device test did not run"; exit 1; }
|
|
grep -q '^quantum-meter: the counters are not live here' "$RUNNER_TEMP/meter.log" \
|
|
|| { echo "::error::the meter's device test found no adapter, so it checked nothing"; exit 1; }
|
|
|
|
member-metal:
|
|
needs: relevant
|
|
if: needs.relevant.outputs.run == 'true'
|
|
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
|
|
# The counters exist here. The device test prints a `quantum-meter hardware:` line
|
|
# for each window it read: a figure, or why another process's GPU use left it
|
|
# none. The tool then calibrates both members on one circuit and, where both
|
|
# windows earn a figure, places it.
|
|
- name: The meter on this process's counters
|
|
shell: bash
|
|
working-directory: wai/tools/quantum-meter
|
|
run: |
|
|
set -euo pipefail
|
|
nice -n 10 cargo test --locked --release -- --nocapture 2>&1 | tee "$RUNNER_TEMP/meter.log"
|
|
grep -q '^test a_members_runs_are_metered_over_a_window_the_counters_resolve \.\.\. ok$' "$RUNNER_TEMP/meter.log" \
|
|
|| { echo "::error::the meter's device test did not run"; exit 1; }
|
|
grep -q '^quantum-meter hardware: ' "$RUNNER_TEMP/meter.log" \
|
|
|| { echo "::error::the meter read no window: its counters are not live on this host"; exit 1; }
|
|
nice -n 10 cargo run --locked --release -- --counter-ppm 50000 2>&1 | tee "$RUNNER_TEMP/meter-tool.log"
|
|
grep -q '^quantum-meter: local/cpu-' "$RUNNER_TEMP/meter-tool.log" \
|
|
|| { echo "::error::the tool ran no window on the CPU reference"; exit 1; }
|
|
|
|
member-hw:
|
|
needs: relevant
|
|
if: needs.relevant.outputs.run == 'true'
|
|
name: member · GPU, Vulkan (${{ matrix.host }})
|
|
runs-on: ${{ matrix.runner }}
|
|
timeout-minutes: 150
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
# Each host's adapters, declared here: its GPUs and the software
|
|
# Vulkan driver. The wide sizes run on the GPU only.
|
|
- host: jetson-hub
|
|
runner: linux-hw
|
|
adapters: gpu-vulkan-10de,gpu-vulkan-8086,swgpu-vulkan-10005
|
|
- host: thor
|
|
runner: linux-arm64-hw
|
|
adapters: gpu-vulkan-10de,swgpu-vulkan-10005
|
|
env:
|
|
WAI_QUANTUM_WEBGPU_EXPECT: ${{ matrix.adapters }}
|
|
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: |
|
|
set -euo pipefail
|
|
echo "adapters declared: $WAI_QUANTUM_WEBGPU_EXPECT"
|
|
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
|
|
|
|
member-amd:
|
|
needs: relevant
|
|
if: needs.relevant.outputs.run == 'true'
|
|
name: member · integrated GPU, Vulkan (framework-128gb)
|
|
runs-on: linux-amd
|
|
timeout-minutes: 150
|
|
env:
|
|
# The adapters are declared by the host, in its runner's environment
|
|
# (WAI_QUANTUM_AMD_WEBGPU_EXPECT); with no declaration, the integrated GPU
|
|
# and the software Vulkan driver. The wide sizes run on the GPU only.
|
|
WAI_QUANTUM_WEBGPU_WIDE: '1'
|
|
CARGO_PROFILE_DEV_DEBUG: '0'
|
|
CARGO_BUILD_JOBS: '12'
|
|
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. The
|
|
# host names its own route to the forge (WAI_FORGE_URL).
|
|
git fetch -q --depth 1 "${WAI_FORGE_URL:-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: |
|
|
set -euo pipefail
|
|
export WAI_QUANTUM_WEBGPU_EXPECT="${WAI_QUANTUM_AMD_WEBGPU_EXPECT:-gpu-vulkan-1002,swgpu-vulkan-10005}"
|
|
echo "adapters declared: $WAI_QUANTUM_WEBGPU_EXPECT"
|
|
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:
|
|
needs: relevant
|
|
if: needs.relevant.outputs.run == 'true'
|
|
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 reaches both of this host's GPUs through both backends, so one job
|
|
# certifies five adapters rather than one per backend: the member test
|
|
# enumerates every adapter in the one process, and the DX12 keys exercise the
|
|
# WGSL -> HLSL path (naga) that no other member covers. Not a required status.
|
|
member-windows:
|
|
name: member · DX12 and Vulkan (cbio-windows)
|
|
runs-on: windows
|
|
timeout-minutes: 150
|
|
env:
|
|
# The key list this host's first run printed:
|
|
# gpu-dx12-10de discrete NVIDIA, DX12
|
|
# gpu-dx12-8086 integrated Intel, DX12
|
|
# gpu-vulkan-10de discrete NVIDIA, Vulkan
|
|
# gpu-vulkan-8086 integrated Intel, Vulkan
|
|
# swgpu-dx12-1414 Microsoft's software adapter (WARP), class Cpu
|
|
# Adding or removing a driver changes this set, and the member test fails
|
|
# until this line matches it again.
|
|
WAI_QUANTUM_WEBGPU_EXPECT: gpu-dx12-10de,gpu-dx12-8086,gpu-vulkan-10de,gpu-vulkan-8086,swgpu-dx12-1414
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
# The runner writes an unsigned .ps1 per step, which the default policy
|
|
# refuses. pwsh, not Windows PowerShell: the 5.1 parser rejects the PS7
|
|
# syntax this repo's scripts use.
|
|
- name: Allow the runner's generated scripts to run
|
|
shell: pwsh
|
|
run: Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
|
|
# `bash` on this host resolves to the WindowsApps WSL stub, and the machine
|
|
# PATH carries Git\cmd (git.exe) but not Git\bin (bash.exe). Without this
|
|
# every `shell: bash` step below would run under WSL, which reaches none of
|
|
# the Windows GPU drivers.
|
|
- name: Put Git Bash on PATH
|
|
shell: pwsh
|
|
run: |
|
|
$gitBash = 'C:\Program Files\Git\bin'
|
|
if (-not (Test-Path "$gitBash\bash.exe")) { throw "Git Bash is missing at $gitBash" }
|
|
$gitBash | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
|
- name: The shell is Git Bash, not WSL
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
command -v bash
|
|
# A WSL bash reports Linux; Git Bash reports MINGW or MSYS.
|
|
case "$(uname -s)" in
|
|
MINGW*|MSYS*) ;;
|
|
*) echo "::error::bash is $(uname -s), not Git Bash"; exit 1 ;;
|
|
esac
|
|
- name: The member's tests
|
|
shell: bash
|
|
run: scripts/wai-quantum-webgpu-member.sh
|
|
# wai-rs is built with --no-default-features here for the same reason as the
|
|
# other GPU members: its default `codecs` feature links system codec
|
|
# libraries this host does not have, and the corpus needs none of them.
|
|
- name: The conformance corpus through the member
|
|
shell: bash
|
|
working-directory: wai/wai-rs
|
|
run: cargo run --locked --no-default-features --features quantum_fabric_webgpu --bin wai_quantum_vectors -- verify ../quantum-conformance --webgpu
|