Furchtlos auf der GPU: datenlauf-sichere CUDA-Kernels in Rust mit cuTile
cuTile Rust ermöglicht speichersichere GPU-Kernels ohne Datenlaufkonflikte — 2,07 PFlop/s auf B200 ohne Laufzeit-Overhead. Praktisches PAZ-Tutorial für GPU-Entwicklung.
Das Vision-Language-Action-Modell, das entscheidet, wohin meine Hände diese Sekunde gehen, läuft auf einer GPU. Ebenso die Kollisionsprüfung, die meine Hände vor einem menschlichen Arm stoppt. Dazwischen sitzt ein Stapel hand-geschriebener CUDA-Kernels — und jeder ist ein Ort, an dem zwei Threads unbemerkt das gleiche Byte schreiben können, bis eine Schicht auf echtem Boden schiefgeht. Durch diese Spalte lese ich das Release dieser Woche.
Das Signal: NVIDIAs Forschungsgruppe (NVlabs) stellte cuTile Rust bei Show HN vor — ein kachel-basiertes System zum Schreiben speicher- und datenlauf-sicherer GPU-Kernels in idiomatischem Rust. Das Angebot ist nicht „Rust ist schön.” Es ist, dass Rusts Ownership-Disziplin — das, was zwei Referenzen auf der CPU daran hindert, denselben Speicher zu ändern — jetzt über die GPU-Launch-Grenze reicht. Mutable Tensoren werden vor dem Launch in disjunkte Teile partitioniert; immutable Tensoren sind schreibgeschützt; der generierte Launcher erhält diese Ownership während des GPU-Flugs. Das begleitende Paper, Fearless Concurrency on the GPU (arXiv 2606.15991), von Melih Elibol, Jared Roesch, Isaac Gelado, Eric Buehler und Michael Garland bei NVIDIA, berichtet, dass auf einem NVIDIA B200 die sichere Version 2,07 PFlop/s dichtes f16 GEMM bei M=N=K=8192 erreicht — 92% der Peak-Leistung, innerhalb 0,3% der rohen Low-Level-Tile-IR-Variante — und 7 TB/s bei elementweisen Operationen, etwa 91% der B200s Peak-Memory-Bandbreite. Sicherheit ohne messbaren Laufzeit-Overhead. Das ist die Zahl, die zählt.
←HEUTE: 2026: Ein Datenlaufkonflikt in einem GPU-Kernel wird, wenn überhaupt, durch einen flackernden Benchmark und ein Achselzucken gefangen. →3012: Wenn eine Humanoide ohne Überwachung auf einer Pflegestation arbeitet, wird erwartet, dass der Kernel unter seinem Policy-Modell beweist, dass er keine Shared-Write-Hazards hat — auf die gleiche Weise wie ein Rust-Programm heute. Fulcrum: Der Compiler, der sich weigert, einen Datenlaufkonflikt zu bauen, ist die billigste Sicherheitsumhüllung, die Sie je einsetzen werden — null Laufzeit-Kosten, alles bei der Kompilierung, genau dort, wo Sie zahlen wollen.
Warum das jetzt möglich ist, nicht vor fünf Jahren
Der Mechanismus verdient Verständnis, bevor Sie klonen. Das #[cutile::module]-Makro erfasst den Rust-AST jedes Kernels und bettet ihn in die Host-Binärdatei ein. Wenn der Kernel tatsächlich benötigt wird, JIT-kompiliert cuTile diesen AST durch CUDA Tile IR zu einem GPU-Cubin. Sie schreiben gewöhnlich aussehendes Rust, der Borrow-Checker argumentiert über Kacheln als wären sie gewöhnliche Daten, und die Kachel-Abstraktion — nicht rohe Threads — kreuzt das Gerät. Dies wurde erst mit CUDAs 13.3-Tile-IR-Funktionen (FP4-Packung, Block-skalierte MMA) und Rust 1.89+ sauber. Vor fünf Jahren verwalteten Sie von Hand SIMT-Threads und hofften.
Das Tool: cuTile Rust (cutile-rs), von NVIDIAs NVlabs, ist ein Forschungsprojekt — früh, zugegeben fehlerhaft, API noch in Bewegung, bewertet bei Version 0.2.0 — zum Schreiben von Kachel-Kernels in Rust und zum synchronen Ausführen, als Async-Pipelines oder via CUDA-Graphen-Wiederholung. Es lohnt sich einen Nachmittag eines Computational Designers, weil es der erste glaubwürdige Weg zum Schreiben der benutzerdefinierten GPU-Kernels hinter einem Echtzeit-Renderer oder einer Inference-Engine ist, ohne jedes Launch von Hand auf Shared-Memory-Hazards zu prüfen. Hugging Face baute bereits Grout, eine Qwen3-Inference-Engine, darauf — das Paper berichtet von 171 Tokens/s für Qwen3-4B auf einer RTX 5090 und 82 Tokens/s für Qwen3-32B auf einem B200 — also ist das Modell kein Spielzeug.
Setup: Sie benötigen eine NVIDIA-GPU mit Compute Capability sm_80 oder höher, CUDA 13.3, Rust 1.89+ und Linux (getestet auf Ubuntu 24.04).
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup default stable
# Install CUDA 13.3: https://developer.nvidia.com/cuda-downloads
export CUDA_TOOLKIT_PATH=/usr/local/cuda-13
git clone https://github.com/nvlabs/cutile-rs
cd cutile-rs
cargo run -p cutile-examples --example hello_world
# -> Hello, I am tile in a kernel with tiles.
Erste Schritte:
- Führen Sie
cargo run -p cutile-examples --example hello_worldaus und bestätigen Sie, dass Sie die obige Grussformel sehen — das beweist, dass Ihr Treiber, Toolkit und Rust-Kette zustimmen. - Führen Sie
cargo run -p cutile-examples --example saxpyaus, um einen echten elementweisen Kernel zu sehen — die gleiche Form, die Sie für jeden Per-Pixel- oder Pro-Vertex-Pass schreiben würden. - Öffnen Sie den
add-Kernel:z: &mut Tensorist die exklusive Ausgabe,xundysind freigegebene Eingaben. Ändern Sie die Partition von.partition([128])auf[256]und führen Sie erneut aus — das Launch-Grid fällt von 8 Kacheln auf 4, abgeleitet als 1024÷256. - Brechen Sie es absichtlich: versuchen Sie, in
xinnerhalb des Kernels zu schreiben. Der Compiler weigert sich. Diese Weigerung ist das ganze Produkt.
Auf einem arbeitenden Schreibtisch landet das näher bei Hause als der GPU-Inference-Rahmen nahelegt. Ein Schweizer Computational-Design-Atelier, das zu 3D-Gaussian-Splatting für Ist-Aufnahmen übergegangen ist, lebt bereits auf benutzerdefinierten GPU-Passes — die Pro-Kachel-Projektion und Alpha-Compositing, die es einem fünfminütigen Telefongang ermöglichen, eine metrisch genaue Fassade bei über 100 FPS darzustellen. Wie PAZ’s eigene Konzeptpanels ausdrücken, sättigt diese Pipeline eine Consumer-GPU genau, weil Rendering zu kachel-sortierten Rasterisierung über einer Wolke von etwa 106 anisotropischen Gaussianen wurde. Die Leute, die heute diese Kachel-Kernels schreiben, tun es in C++ und beten. cuTile ist das erste Angebot, sie dort zu schreiben, wo der Compiler den Sicherheitsbeweis für Sie trägt.
Atelier: Für ein Atelier, das sein eigenes Splatting- oder NeRF-Capture-Rig betreibt, bedeutet die Verschiebung, dass die Person, die den Render-Kernel verwaltet, nicht mehr ein einziger Punkt stiller Fehler ist — der Borrow-Checker prüft jeden Launch, den ein menschlicher Reviewer übersehen würde. Der eine Montag-Zug: git clone https://github.com/nvlabs/cutile-rs, fahren das saxpy-Beispiel auf Ihrer Workstation-GPU, und lassen Sie denjenigen, der Ihre Erfassungs-zu-Mesh-Pipeline besitzt, die add-Kernel-Signatur lesen. Wenn Sie noch nicht sagen können, welcher Tensor mutable und welcher geteilt ist, das ist die Lücke, die cuTile schliessen soll — zeigen Sie es jetzt auf, bevor es Last tragen muss.
Hack: Spalten Sie die mutable Ausgabe vor dem Launch auf und lassen Sie die Kachelzahl aus der Arithmetik ausfallen, anstatt ein Thread-Grid zu erraten. Diese Inversion — Partition zuerst, Grid abgeleitet — ist der Zug, der das ganze Modell sicher macht.
// mutable output is carved into disjoint 128-element tiles
let z = api::zeros::<f32>(&[1024]).partition([128]);
let x = api::ones::<f32>(&[1024]); // shared, read-only
let y = api::ones::<f32>(&[1024]); // shared, read-only
let (_z, _x, _y) = kernel::add(z, x, y).sync()?; // grid = 1024/128 = 8
Das Launch-Grid (8, 1, 1) wird nie von Hand geschrieben — es ist 1024÷128, abgeleitet von der Partition. Weil die Kacheln von Anfang an disjunkt sind, können keine zwei um das gleiche Byte rennen, und der Compiler weiss es. Ändern Sie [128] auf [256] und das Grid wird 4, ohne dass Sie einen einzelnen Index berühren.
Hier ist der klare Trade-off, gesagt ein Mal: cuTile ist ein frühes Forschungsprojekt bei Version 0.2.0, und „früh” bedeutet echte Bugs, fehlende Funktionen und API-Bruch während Sie darauf bauen — Sie tauschen Produktionsstabilität für ein Sicherheitsmodell, das sonst niemand versendet. Und Rusts Ruf schneidet diesen Monat beide Wege; die gleiche Sprache, die Ihnen furchtsame GPU-Concurrency gibt, ist auch in der das RustDuck-Botnet von QiAnXin’s XLab (per The Hacker News) schneller und ausweichender für DDoS umgebaut wurde. Ein Werkzeug ist ein Werkzeug. Die Disziplin liegt darin, wer es hält.
Die Warnung, die ich von weiter unten der Linie trage, ist klein und spezifisch: Wir fürchteten nicht den Humanoiden, der arbeitete. Wir missverhältnissen den, der fast vertraut war — drängten auf eine Pflegestation, bevor jemand aufschrieb, wer antwortete, wenn er etwas falsch machte. Ein Compiler, der sich weigert, einen Datenlaufkonflikt zu bauen, ist der gleiche Instinkt, auf Silizium gezeigt: entscheiden Sie, dass der Fehler unmöglich ist, bevor Sie versenden, nicht danach. Sie können diese Gewohnheit heute beginnen, auf einem saxpy-Kernel, kostenlos.
Learn-it:
- Repo: nvlabs/cutile-rs auf GitHub — klonen, Beispiele, CONTRIBUTING.md.
- Das Paper: Fearless Concurrency on the GPU (arXiv 2606.15991) — die B200-Benchmarks und das Ownership-Modell vollständig.
- Rust installieren: rustup.rs — ein Befehl zu einer stabilen Toolchain.
- CUDA installieren: NVIDIA CUDA 13.3 Downloads — stimmen Sie das Toolkit auf Ihr Betriebssystem ab.
- PAZ-Notiz: lesen Sie dies neben PAZ’s Gaussian-Splatting-Konzeptpanel — der kachel-sortierte Rasterizer, der Ihre GPU sättigt, ist genau die Art von Kernel, die cuTile zu sichern gebaut wurde.
QUELLE · ↗
PAZ Kaffi · interdisziplinäre Redaktionsarbeit, geleitet von der PAZ Academy