Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
146 commits
Select commit Hold shift + click to select a range
7738999
fix: keep generated cuTile locations inside their containing functions
Arthur031221 Oct 3, 2026
77816f6
fix(cutile): attribute generated entry setup to the user signature
elibol Oct 10, 2026
f39c959
cuda-core: safe element casts require AnyBitPattern; bool is DeviceCopy
elibol Oct 13, 2026
f468474
fix(cutile-compiler): attribute short-circuit boolean constants to ex…
GiGiKoneti Oct 16, 2026
afeb8b8
Use NVVM debug metadata merge behavior for native LTO
tpn Oct 20, 2026
b76010f
refactor(cutile): select debug or optimized device code as one Codege…
almightychang Oct 21, 2026
b461498
feat(cutile): add CUTILE_JIT_* run-time compile overrides
almightychang Oct 21, 2026
37c540e
Merge main into bool and element-cast safety fix
elibol Oct 21, 2026
f42ed4f
Fix atomic buffer representation and zeroed initialization safety
elibol Oct 21, 2026
787e241
Refresh remaining SIMT example locks for bytemuck
elibol Oct 21, 2026
228652d
Align DeviceCopy derive diagnostics with the validity contract
elibol Oct 21, 2026
2788c6c
fix: enforce Tile argument contracts and pinned host alignment
elibol Oct 21, 2026
98c023d
ci: validate interop stack against the v0.5.0 API boundary
elibol Oct 21, 2026
70f5676
refactor(cuda-core): share host handles and allocations across Tile a…
elibol Oct 21, 2026
f0f61e2
fix(cuda-core): complete context migration in Tile consumers
elibol Oct 21, 2026
8002432
docs: order shared host imports consistently
elibol Oct 21, 2026
80d9e7a
refactor: share the async host runtime across Tile and SIMT
elibol Oct 21, 2026
fcfe932
fix(cuda-async): bound the GEMM output scalar for shared launches
elibol Oct 21, 2026
a9f81c5
fix(cuda-macros): marshal async slice arguments through the shared la…
elibol Oct 21, 2026
ac90d9e
Preserve inline scopes in line-table debug info
tpn Oct 22, 2026
a450156
test: pin the locations of generated cuTile constants
Arthur031221 Oct 22, 2026
765cb1f
test(cutile): isolate CUTILE_JIT_* cases and compare modes across pro…
almightychang Oct 22, 2026
eec8776
fix(cuda-core): preserve shared read access on empty and peeled Devic…
nihalpasham Oct 22, 2026
c68eee0
fix(cuda-async,cuda-host): preserve concurrent read permissions on De…
nihalpasham Oct 22, 2026
9718b43
fix(cutile): retain source origins for generated code and host checks…
elibol Oct 22, 2026
08b9d85
fix(cutile): retain source origins for generated code and host checks…
elibol Oct 22, 2026
b8c263e
ci: validate pull requests targeting release branches
elibol Oct 22, 2026
8d24ed9
Merge remote-tracking branch 'fork/main' into fix/bool-device-copy-an…
elibol Oct 22, 2026
282eeb1
fix(cuda-core): count allocation views independently of leases
elibol Oct 22, 2026
bb0e891
fix(cutile): separate tensor aliases from completion leases
elibol Oct 22, 2026
f7fa559
Merge branch 'fix/bool-device-copy-anybitpattern-casts' into refactor…
elibol Oct 22, 2026
d52fbce
Merge branch 'refactor/shared-cuda-core' into refactor/shared-cuda-async
elibol Oct 22, 2026
edfe8d5
Merge branch 'refactor/shared-cuda-async' into release/v0.5.0-host-de…
elibol Oct 22, 2026
0143af5
chore: prepare shared host and Tile crates for v0.5.0 (#1614)
elibol Oct 22, 2026
19205d2
Merge v0.5.0 version baseline from main
elibol Oct 22, 2026
36f9072
Merge updated DeviceCopy prerequisite after version bump
elibol Oct 22, 2026
6d311cb
Merge updated shared core prerequisite after version bump
elibol Oct 22, 2026
1dc2e01
Merge current host stack with main version baseline
elibol Oct 22, 2026
927d462
Add the cute-rs preview: CuTe kernels in Rust for sm_100a and sm_120a…
nihalpasham Oct 23, 2026
93dd507
Merge current main and reconcile CuTe dependency lockfiles
elibol Oct 23, 2026
47042a8
Merge current main and migrate CuTe consumers to shared core
elibol Oct 23, 2026
52dccfe
Merge updated core prerequisite with CuTe integration
elibol Oct 23, 2026
c80633a
Refresh release integration with current host stack
elibol Oct 23, 2026
2f47ad0
chore(cute-rs): sync shared host crate versions to v0.5.0 in lockfile…
nihalpasham Oct 23, 2026
b811b70
fix(async): restore caller-managed async_on lifetimes
elibol Oct 23, 2026
038c82d
Integrate restored async_on lifetimes for v0.5.0
elibol Oct 23, 2026
e6c0179
cuda-oxide: move SIMT toolchain pin to stable 1.99.1 (#1609)
nihalpasham Oct 23, 2026
9e75d77
chore(cuda-oxide): update flake.lock for 1.99.1, scaffold config, and…
nihalpasham Oct 23, 2026
ad0a42c
docs(cuda-oxide): update remaining nightly references and doctor chec…
nihalpasham Oct 23, 2026
fc74719
fix: bump example tokio pins past RUSTSEC-2026-0386 (#1619)
roivanov Oct 23, 2026
9df9e7c
docs(book): soften dark-mode SVG fill colors across cute and compiler…
nihalpasham Oct 25, 2026
2794a67
test(cutile): validate generated constant origins against current main
elibol Oct 26, 2026
899e14b
test(cutile): verify wrapper provenance in optimized and full debug m…
elibol Oct 26, 2026
a844d56
docs(cutile): document v0.5 debug-mode migration and validate current…
elibol Oct 26, 2026
bec608b
test(oxide): validate inline source scopes against current main
elibol Oct 26, 2026
64f0ebf
fix(cutile): retain const-bool binding scopes and test constant prove…
elibol Oct 26, 2026
a28eee3
test(oxide): validate NVVM debug metadata with current main
elibol Oct 26, 2026
62c51d1
Integrate current main and generated-constant debug origins for v0.5.0
elibol Oct 26, 2026
e92ac28
Integrate entry-wrapper and assumption source locations for v0.5.0
elibol Oct 26, 2026
7cefbb1
Integrate constant-expression and boolean-binding debug origins for v…
elibol Oct 26, 2026
33e5b5f
Integrate consistent debug modes and JIT environment overrides for v0…
elibol Oct 26, 2026
7e5fc19
Integrate NVVM debug metadata compatibility for v0.5.0
elibol Oct 26, 2026
86983db
Integrate SIMT inline scopes in line-info builds for v0.5.0
elibol Oct 26, 2026
29b9716
Keep both assembler regressions in the combined release test runner
elibol Oct 26, 2026
933e221
test(cutile): isolate known tileiras 13.4.92 debug loss
elibol Oct 26, 2026
7336cac
Integrate the scoped tileiras 13.4.92 debug-test handling
elibol Oct 26, 2026
b25b4fe
test(cutile): recognize the CI assembler debug limitation
elibol Oct 27, 2026
a8d9182
Integrate verified CI assembler handling from PR 1385
elibol Oct 27, 2026
0f68e38
feat(cuda-oxide): shared-memory i32/addrspace(3) codegen and CTA-loca…
nihalpasham Oct 27, 2026
c649343
feat(cuda-oxide): use 32-bit shared-memory pointers (p3:32:32:32 + --…
nihalpasham Oct 27, 2026
f856350
feat(cuda-oxide): add #[unroll(never)], propagate llvm.loop.unroll.di…
nihalpasham Oct 27, 2026
ddb7572
ci: run gpu tests for cutile-rs (#1607)
assignUser Oct 27, 2026
a4a939a
perf(cuda-oxide): 7-stage SMEM pipeline and wave-tail tile balancing …
nihalpasham Oct 27, 2026
92d51a5
Use NVVM debug metadata merge behavior for native LTO (#1564)
tpn Oct 28, 2026
10e7df4
Preserve inline source scopes in line-table debug info (#1582)
tpn Oct 28, 2026
f613887
fix: correct cuTile source locations for generated constants (#1385)
Arthur031221 Oct 28, 2026
701cf41
Merge main and retain generated-constant and short-circuit regressions
elibol Oct 28, 2026
3ec9814
Merge main and validate debug overrides with current source-location …
elibol Oct 28, 2026
6e95929
Merge main while retaining entry-wrapper and generated-constant regre…
elibol Oct 28, 2026
213ce83
Merge main and preserve the v0.5.0 host and debug integration
elibol Oct 28, 2026
4650831
Merge refreshed short-circuit debug PR into release candidate
elibol Oct 28, 2026
4fa7719
Merge refreshed debug mode PR into release candidate
elibol Oct 28, 2026
bb781ad
Merge refreshed entry location PR into release candidate
elibol Oct 28, 2026
6e9b332
Run integrated host interop suites through the GPU archive runner
elibol Oct 28, 2026
42a1048
fix(cutile-compiler): preserve origins of short-circuit, folded and b…
GiGiKoneti Oct 29, 2026
0d62b68
cutile: one CodegenMode for device debug, plus CUTILE_JIT_* run-time …
almightychang Oct 29, 2026
765e108
Merge accepted debug fixes from main into release candidate
elibol Oct 29, 2026
9f19c0c
Merge accepted debug controls and expression origins into entry-locat…
elibol Oct 29, 2026
91f3fbc
Align release integration with the refreshed entry-location review
elibol Oct 29, 2026
33886cf
Put the Rust row inside the prerequisites table (#1665)
CanReader Oct 29, 2026
4474b3e
docs: fix moved thread indices in kernel examples (#1639)
0130w Oct 29, 2026
1ab5377
docs(examples): move atomics to the typed-slice sound form (#1500)
navneet83 Oct 29, 2026
d206df1
test(cuda-oxide): write fake tools through cp (#1579)
praveenperera Oct 29, 2026
a259743
fix(cuda-oxide-mlir-export): saturate float to int casts (#1655)
Rachit2323 Oct 29, 2026
3f1f432
feat(cuda-device): support u64 and i64 in cooperative_groups reductio…
praveenperera Oct 29, 2026
f3fb10f
fix(unroll): fold const-generic loop bounds (#1569)
praveenperera Oct 29, 2026
5759cb3
feat(unroll): add #[nounroll] to keep loops rolled (#1552)
praveenperera Oct 29, 2026
9fcd57f
feat(cuda-oxide): generate libm-to-libdevice math dispatch and lower …
uurl Oct 29, 2026
023f2ac
fix(mir-lower): support recursive packed AS3 carrier local projection…
uurl Oct 29, 2026
9ff426b
feat(cute-rs): add CuTeDSL-aligned SM100 pipelines, TmemAllocator, an…
nihalpasham Oct 30, 2026
76ac102
feat(cute-rs): complete SM120a CuTeDSL parity, TiledCopy, BF16/NVFP4 …
nihalpasham Oct 30, 2026
95a22fc
Merge current main before host interop review follow-ups
elibol Oct 30, 2026
c1e2df5
fix(cuda-core): require initialized source bytes for safe buffer casts
elibol Oct 30, 2026
e6bb3ea
fix(cutile): separate completion retention from tensor buffer views
elibol Oct 30, 2026
3605ee2
Merge current main and initialized-source cast fix into shared host core
elibol Oct 30, 2026
1873341
Merge current main and host review fixes into shared async runtime
elibol Oct 30, 2026
dd7eb32
fix(ci): run shared host interop before reporting GPU test results
elibol Oct 30, 2026
5633d86
Merge shared core GPU test registration fix
elibol Oct 30, 2026
18fbdd6
Merge reviewed host fixes and current main into v0.5.0 candidate
elibol Oct 30, 2026
04d17ef
fix(ci): refresh math_special lockfile for shared host API dependencies
elibol Oct 30, 2026
90191e4
Merge current-main example lockfile correction
elibol Oct 30, 2026
3ae634e
Merge current-main example lockfile correction
elibol Oct 30, 2026
64ee86f
Merge current-main example lockfile correction
elibol Oct 30, 2026
117205c
fix(examples): migrate expanded atomics example to owned conversions
elibol Oct 30, 2026
98d0820
Merge atomic example compatibility fix
elibol Oct 30, 2026
95a51d7
Merge atomic example compatibility fix
elibol Oct 30, 2026
c6c5a86
Merge atomic example compatibility fix
elibol Oct 30, 2026
b025a8b
fix(cutile): attribute generated entry setup to the user signature (#…
elibol Oct 30, 2026
c5ea583
Merge main after entry-wrapper debug fix; preserve both changelog ent…
elibol Oct 30, 2026
c16fa3f
Merge refreshed safe-cast prerequisite after debug fix lands
elibol Oct 30, 2026
eddfe14
Merge refreshed shared-core prerequisite after debug fix lands
elibol Oct 30, 2026
4458979
Record merged entry-wrapper debug fix in release candidate ancestry
elibol Oct 30, 2026
dfea116
cuda-core: safe element casts require AnyBitPattern; bool is DeviceCo…
elibol Oct 30, 2026
ba76442
Record accepted safe-cast squash merge without changing the reviewed …
elibol Oct 30, 2026
ede4267
Record accepted safe-cast ancestry through shared core
elibol Oct 30, 2026
5270acc
Record accepted safe-cast merge in release candidate ancestry
elibol Oct 30, 2026
6a6372e
refactor(cuda-core): share host handles and allocations across Tile a…
elibol Oct 30, 2026
21bc9bb
Record accepted shared-core squash merge without changing the reviewe…
elibol Oct 30, 2026
10c5e9c
Record accepted shared-core merge in release candidate ancestry
elibol Oct 30, 2026
2b59e2d
Unify the async host runtime and remove cuda_async::simt (#1604)
elibol Oct 30, 2026
5676dc0
Merge accepted shared async runtime into v0.5.0 candidate
elibol Oct 30, 2026
5c36cb9
ci: move ubuntu-latest jobs onto linux-amd64-cpu4 (#1580)
roivanov Oct 30, 2026
b29169a
fix(cutile): keep the slice offset in TensorView::view specialization…
younes-io Oct 30, 2026
79769ec
test(cutile): skip FP8 execution on unsupported targets (#1683)
elibol Oct 30, 2026
18a0407
fix(cutile): pass the smoke-test feature to the benchmark smoke run (…
0z5a Oct 30, 2026
dfd6867
Integrate accepted slice-offset, FP8 and benchmark fixes for v0.5.0
elibol Oct 30, 2026
8b38fb8
fix(cuda-bindings): resolve complete structs with libclang 22
elibol Oct 30, 2026
54be19d
Integrate libclang 22 binding layout fix for v0.5.0 SWQA
elibol Oct 30, 2026
0818e44
fix(ci): align example rustc-hash pins after bindgen upgrade
elibol Oct 30, 2026
2c01bfb
Integrate example lockfile alignment for v0.5.0 CI
elibol Oct 30, 2026
0925800
fix(cutile): validate full tensor shapes before allocation (#1452)
uurl Oct 31, 2026
3f726ca
fix(ci): run bindgen regression only on compiler-equipped runners
elibol Oct 31, 2026
b216c9d
Merge accepted tensor-shape validation into final v0.5.0 fix
elibol Oct 31, 2026
e16b73a
Integrate final binding-test CI fix and accepted tensor-shape validation
elibol Oct 31, 2026
2d47e43
fix(cuda-bindings): preserve complete struct layouts with libclang 22…
elibol Oct 31, 2026
d2c8120
Integrate accepted v0.5.0 fixes and deduplicate release changelog
elibol Oct 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
54 changes: 54 additions & 0 deletions .github/actions/setup-cuda-container/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
---
name: Set up the CUDA devel container
description: >-
Installs the host packages the nvidia/cuda devel image lacks, marks the
workspace safe for git, and installs rustup. Callers use the $/ form so
this runs before checkout and git is already installed. The image already
contains the CUDA toolkit. Later steps pick up rust-toolchain.toml from
their working directory.

runs:
using: composite
steps:
- name: Install host packages
shell: bash
run: |
apt-get update -qq
# python3 is for sync-example-locks.sh. The image has neither git nor
# python3; git has to be present before actions/checkout.
apt-get install -y -qq --no-install-recommends \
build-essential ca-certificates curl git pkg-config libclang-dev \
python3 wget

- name: Mark the workspace as a safe git directory
shell: bash
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"

- name: Install Rust
shell: bash
env:
RUSTUP_VERSION: "1.29.2"
# SHA-256 of rustup-init for x86_64-unknown-linux-gnu, published next to
# the binary as .../rustup/archive/1.29.2/x86_64-unknown-linux-gnu/rustup-init.sha256.
# Bump both values together.
RUSTUP_INIT_SHA256: "5be191e8c70a5007074254cb74d78dbfdd25cd5a61c27de7b8e5410122ec24f4"
run: |
set -euo pipefail
[ "$(uname -m)" = "x86_64" ] || { echo "the rustup-init pin is for x86_64"; exit 1; }
init="${RUNNER_TEMP}/rustup-init"
curl --proto '=https' --tlsv1.2 -sSfo "${init}" \
"https://static.rust-lang.org/rustup/archive/${RUSTUP_VERSION}/x86_64-unknown-linux-gnu/rustup-init"
echo "${RUSTUP_INIT_SHA256} ${init}" | sha256sum -c -
chmod +x "${init}"
"${init}" -y --no-modify-path --profile minimal --default-toolchain none
rm -f "${init}"
echo "${HOME}/.cargo/bin" >> "${GITHUB_PATH}"
# $/ runs this before the workspace checkout. The action download is
# the same commit, and rustup finds rust-toolchain.toml by walking up
# from the working directory. The root file is the stable pin;
# cuda-oxide/ selects the nightly.
repo="${GITHUB_ACTION_PATH}/../../.."
(cd "${repo}" && "${HOME}/.cargo/bin/rustup" show)
(cd "${repo}/cuda-oxide" && "${HOME}/.cargo/bin/rustup" show)
1 change: 1 addition & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
## Checklist

- [ ] All commits signed off (`git commit -s`)
- [ ] All commits cryptographically signed and shown as Verified on GitHub (`git commit -S`)
- [ ] SPDX headers on new source files

---
Expand Down
76 changes: 50 additions & 26 deletions .github/workflows/book.yml
Original file line number Diff line number Diff line change
@@ -1,27 +1,15 @@
name: Deploy CUDA Rust Docs

# Path-filtered lane: only documentation sources can change what this builds.
# Self-hosted runners reject pull_request. copy-pr-bot mirrors trusted PRs to
# pull-request/<n>, and the build job triggers on that push. `deploy` stays on
# main: a mirror push is a push event, so an event-name check would publish it.
on:
push:
branches: [main]
paths:
- 'cuda-oxide/cuda-oxide-book/**'
- 'cutile-rs/cutile-book/**'
- 'cutile-rs/scripts/build_versioned_book.sh'
- 'docs/**'
- '.github/workflows/book.yml'
# Validate the book on PRs too. The build job alone runs there; `deploy` is
# gated below, so a pull request never publishes. Without this the book was
# only ever built after merge, so a PR that broke it could not be caught by
# review or by CI.
pull_request:
branches: [main]
paths:
- 'cuda-oxide/cuda-oxide-book/**'
- 'cutile-rs/cutile-book/**'
- 'cutile-rs/scripts/build_versioned_book.sh'
- 'docs/**'
- '.github/workflows/book.yml'
# No workflow-level paths: filter; the changes job below gates the jobs.
branches:
- main
- "pull-request/[0-9]+"
workflow_dispatch:

# Only checkout rights by default. The Pages deployment permissions live on
Expand All @@ -39,11 +27,47 @@ permissions:
# a slower older commit deploy after a newer one and replace the published site.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

jobs:
# Path gate. copy-pr-bot creates pull-request/<n> at an existing SHA, and
# GitHub often treats that push as having no path changes, so a workflow-level
# `paths:` filter would skip the whole run. This job diffs against main
# instead, as cutile-rs.yml does, and every job below runs when no file diff
# is detected. Other events (schedule, workflow_dispatch) skip the gate.
changes:
if: github.event_name == 'push'
runs-on: linux-amd64-cpu4
timeout-minutes: 5
permissions:
contents: read
outputs:
relevant: ${{ steps.changes.outputs.relevant }}
any_changed: ${{ steps.changes.outputs.any_changed }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: dorny/paths-filter@0e4a8c6effa4802afeda77dc8d303f8176d7dfad # v3.0.4
id: changes
with:
filters: |
relevant:
- 'cuda-oxide/cuda-oxide-book/**'
- 'cutile-rs/cutile-book/**'
- 'cutile-rs/scripts/build_versioned_book.sh'
- 'docs/**'
- '.github/workflows/book.yml'
# `*` covers a root file, `**` every nested path. Both false means
# no file diff was detected.
any_changed:
- '*'
- '**'

build:
runs-on: ubuntu-latest
needs: changes
if: ${{ !cancelled() && (github.event_name != 'push' || needs.changes.outputs.relevant == 'true' || needs.changes.outputs.any_changed != 'true') }}
runs-on: linux-amd64-cpu4
# An umbrella page plus two Sphinx books. Bound the job so a
# wedged install or a sphinx that never returns fails instead of burning to
# the 6-hour default.
Expand Down Expand Up @@ -76,17 +100,17 @@ jobs:
run: |
# Unset CUTILE_DOCS_TAGS → build every tag matching the pattern.
# Empty CUTILE_DOCS_TAGS → current tree only (fast PR check).
if [ "${{ github.event_name }}" = "pull_request" ]; then
export CUTILE_DOCS_TAGS=""
fi
case "${GITHUB_REF}" in
refs/heads/pull-request/*) export CUTILE_DOCS_TAGS="" ;;
esac
bash docs/build_all_docs.sh

# Only `deploy` consumes this, and `deploy` is skipped on pull requests,
# so uploading it there produces an artifact nothing can ever read. A PR's
# job is to prove both Sphinx builds succeed, which the steps above already
# did; gate the upload on the same condition `deploy` uses so the two
# cannot drift apart.
- if: github.event_name != 'pull_request'
- if: github.ref == 'refs/heads/main'
uses: actions/upload-pages-artifact@v3
with:
path: docs/build/html
Expand All @@ -96,7 +120,7 @@ jobs:
# Publishing is for main only. A pull request builds the book to prove it
# is sound and stops there; it never touches the Pages environment or
# holds the deployment permissions below.
if: github.event_name != 'pull_request'
if: github.ref == 'refs/heads/main'
permissions:
pages: write
id-token: write
Expand Down
37 changes: 31 additions & 6 deletions .github/workflows/cargo-deny.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
name: cargo-deny

# Runs as a job of the top-level CI workflow (.github/workflows/ci.yml) on
# push/pull_request, plus a standalone weekly security scan via schedule.
# Runs as a job of the top-level CI workflow (.github/workflows/ci.yml),
# plus a standalone weekly security scan via schedule.
# Concurrency for the CI path is governed by CI's own group.
#
# Four parts of the same concern. `check` enforces the license *policy* over
Expand Down Expand Up @@ -30,14 +30,24 @@ on:
permissions:
contents: read

# A container job's default shell is dash; use bash, as on ubuntu-latest.
defaults:
run:
shell: bash

jobs:
check:
runs-on: ubuntu-latest
runs-on: linux-amd64-cpu4
container:
image: rust:1.98.0-bookworm
timeout-minutes: 10
steps:
- name: Clone repository
uses: actions/checkout@v4

- name: Mark the workspace as a safe git directory
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"

- name: Install cargo-deny
run: cargo install cargo-deny --locked

Expand Down Expand Up @@ -94,25 +104,35 @@ jobs:

license-manifest:
name: dependency-licenses.csv covers every declared crate
runs-on: ubuntu-latest
runs-on: linux-amd64-cpu4
container:
image: rust:1.98.0-bookworm
timeout-minutes: 10
steps:
- name: Clone repository
uses: actions/checkout@v4

- name: Mark the workspace as a safe git directory
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"

# Only reads manifests: `cargo metadata` resolves the graph without
# running build scripts, so this needs no CUDA toolkit and no LLVM.
- name: Verify the license inventory covers the workspace
run: bash cuda-oxide/scripts/check-dependency-licenses.sh

example-policy:
name: deny.toml governs the example workspaces
runs-on: ubuntu-latest
runs-on: linux-amd64-cpu4
container:
image: rust:1.98.0-bookworm
timeout-minutes: 15
steps:
- name: Clone repository
uses: actions/checkout@v4

- name: Mark the workspace as a safe git directory
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"

- name: Install cargo-deny
run: cargo install cargo-deny --locked

Expand All @@ -125,12 +145,17 @@ jobs:

source-headers:
name: every source file carries the SPDX header
runs-on: ubuntu-latest
runs-on: linux-amd64-cpu4
container:
image: rust:1.98.0-bookworm
timeout-minutes: 5
steps:
- name: Clone repository
uses: actions/checkout@v4

- name: Mark the workspace as a safe git directory
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"

# Pure text check over tracked files: no toolchain, no network. The OSRB
# review fixed 32 missing headers in #812 and the next two scripts to
# land (#819, #835) drifted again; this makes the third time the last.
Expand Down
10 changes: 4 additions & 6 deletions .github/workflows/ci-status.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@ name: CI status

# One status for the whole repository, so the README needs one badge.
#
# Badges are per workflow file, and the two pipelines have to stay separate
# for now: ci.yml (SIMT and the shared host crates) runs on GitHub-hosted
# runners on push and pull_request; cutile-rs.yml (Tile) runs on NVIDIA
# self-hosted runners, which cannot run on pull_request events, so it
# triggers on push to main and to the copy-pr-bot mirror branches.
# Badges are per workflow file. ci.yml and cutile-rs.yml both run on NVIDIA
# self-hosted runners, which reject pull_request, so both trigger on push to
# main and to the copy-pr-bot mirror branches.
#
# This workflow runs whenever either of them completes on main. For each
# pipeline it finds the newest completed push run on main that actually
Expand All @@ -34,7 +32,7 @@ permissions:
jobs:
status:
name: combined CI status on main
runs-on: ubuntu-latest
runs-on: linux-amd64-cpu4
timeout-minutes: 5
steps:
- name: Report the newest executed main run of each pipeline
Expand Down
76 changes: 55 additions & 21 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,16 @@ name: CI
# Path-filtered SIMT lane: skip when a change cannot affect cuda-oxide or the
# shared host crates. `cuda-oxide/**` is deliberately broad (prose as well as
# code) because guard scripts cross-check the book against the crates.
#
# Self-hosted runners reject pull_request. copy-pr-bot mirrors trusted PRs to
# pull-request/<n>, and this workflow triggers on that push
# (config: .github/copy-pr-bot.yaml).
on:
push:
branches: [main]
paths:
- 'cuda-oxide/**'
- 'cuda-bindings/**'
- 'cuda-core/**'
- 'cuda-core-derive/**'
- 'cuda-async/**'
- 'Cargo.toml'
- 'Cargo.lock'
- '.github/workflows/**'
pull_request:
branches: [main]
paths:
- 'cuda-oxide/**'
- 'cuda-bindings/**'
- 'cuda-core/**'
- 'cuda-core-derive/**'
- 'cuda-async/**'
- 'Cargo.toml'
- 'Cargo.lock'
- '.github/workflows/**'
# No workflow-level paths: filter; the changes job below gates the jobs.
branches:
- main
- "pull-request/[0-9]+"

# Each commit on main gets its own group, so it starts at once. Any other ref
# still shares one group and cancels the older run.
Expand All @@ -44,14 +31,61 @@ permissions:
contents: read

jobs:
# Path gate. copy-pr-bot creates pull-request/<n> at an existing SHA, and
# GitHub often treats that push as having no path changes, so a workflow-level
# `paths:` filter would skip the whole run. This job diffs against main
# instead, as cutile-rs.yml does, and every job below runs when no file diff
# is detected. Other events (schedule, workflow_dispatch) skip the gate.
changes:
if: github.event_name == 'push'
runs-on: linux-amd64-cpu4
timeout-minutes: 5
permissions:
contents: read
outputs:
relevant: ${{ steps.changes.outputs.relevant }}
any_changed: ${{ steps.changes.outputs.any_changed }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: dorny/paths-filter@0e4a8c6effa4802afeda77dc8d303f8176d7dfad # v3.0.4
id: changes
with:
filters: |
relevant:
- 'cuda-oxide/**'
- 'cuda-bindings/**'
- 'cuda-core/**'
- 'cuda-core-derive/**'
- 'cuda-repr/**'
- 'cuda-async/**'
- 'Cargo.toml'
- 'Cargo.lock'
- '.github/workflows/**'
- '.github/actions/setup-cuda-container/**'
# `*` covers a root file, `**` every nested path. Both false means
# no file diff was detected.
any_changed:
- '*'
- '**'

fmt:
needs: changes
if: ${{ !cancelled() && (github.event_name != 'push' || needs.changes.outputs.relevant == 'true' || needs.changes.outputs.any_changed != 'true') }}
uses: ./.github/workflows/fmt.yml

clippy:
needs: changes
if: ${{ !cancelled() && (github.event_name != 'push' || needs.changes.outputs.relevant == 'true' || needs.changes.outputs.any_changed != 'true') }}
uses: ./.github/workflows/clippy.yml

unit-tests:
needs: changes
if: ${{ !cancelled() && (github.event_name != 'push' || needs.changes.outputs.relevant == 'true' || needs.changes.outputs.any_changed != 'true') }}
uses: ./.github/workflows/unit-tests.yml

cargo-deny:
needs: changes
if: ${{ !cancelled() && (github.event_name != 'push' || needs.changes.outputs.relevant == 'true' || needs.changes.outputs.any_changed != 'true') }}
uses: ./.github/workflows/cargo-deny.yml
Loading
Loading