Skip to content

Commit 628c0a9

Browse files
committed
Add blog post for 0.10 release
1 parent 0631183 commit 628c0a9

File tree

1 file changed

+250
-0
lines changed

1 file changed

+250
-0
lines changed

blog/2024-12-29-rust-gpu-0.10.md

+250
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
1+
---
2+
title: "Announcing Rust GPU 0.10"
3+
slug: rust-gpu-0.10
4+
tags: ["announcement", "release"]
5+
draft: true
6+
---
7+
8+
# Announcing Rust GPU 0.10
9+
10+
The Rust GPU maintainers are happy to announce a new version of [Rust
11+
GPU](https://github.com/rust-gpu/rust-gpu), 0.10. Rust GPU makes it possible to write
12+
and run GPU software in Rust.
13+
14+
This release is our first as a [community-owned project](/blog/transition-announcement).
15+
One of our goals is to move releases to a more frequent and rapid pace—the last release
16+
was on July 25, 2023!
17+
18+
We're eager to add more users and contributors. To follow along or get involved, check out the [`rust-gpu` repo on GitHub](https://github.com/rust-gpu/rust-gpu).
19+
20+
<!-- truncate -->
21+
22+
## What's new in 0.10
23+
24+
### Update Rust requirement to a modern version
25+
26+
Rust GPU includes a compiler backend that compiles regular Rust code into
27+
[SPIR-V](https://www.khronos.org/spir/), a low-level format that [most GPUs
28+
understand](https://vulkan.gpuinfo.org/). Because of this deep integration with compiler
29+
internals, Rust GPU must use a very specific version of the Rust compiler. Rust GPU now
30+
supports `nightly-2024-11-22` (up from the ancient `nightly-2023-05-27`). This roughly
31+
corresponds to [Rust 1.83](https://blog.rust-lang.org/2024/11/28/Rust-1.83.0.html).
32+
33+
:::tip
34+
35+
Most real-world projects like [`krnl`](https://github.com/charles-r-earp/krnl) and
36+
[`renderling`](https://github.com/schell/renderling) compile their GPU code with Rust
37+
GPU's specific version of nightly while using stable Rust for the rest of their code. We
38+
are in the process of making this workflow much easier.
39+
40+
:::
41+
42+
Updating to a newer nightly version required heroic effort from
43+
[@eddyb](https://github.com/eddyb), as significant breaking changes to Rust's [internal
44+
allocation model](https://github.com/rust-lang/rust/pull/122053) and
45+
[`#[repr(simd)]`](https://github.com/rust-lang/rust/pull/129403) were introduced in
46+
`rustc`. [@eddyb](https://github.com/eddyb) was able to [vendor in parts of `rustc` and
47+
patch out others](https://github.com/Rust-GPU/rust-gpu/pull/170), unblocking the update
48+
and buying us time to [figure out the best way
49+
forward](https://github.com/Rust-GPU/rust-gpu/issues/182).
50+
51+
Rust GPU is an "out-of-tree" compiler backend. This enables fast iteration while we
52+
explore the problem space, but also makes us more susceptible to this sort of breakage.
53+
One of our long-term goals is to be a supported `rustc` backend.
54+
55+
### **Mesh shader support**
56+
57+
Rust GPU maintainer [@Firestar99](https://github.com/firestar99) and contributor
58+
[@BeastLe9enD](https://github.com/BeastLe9enD) added support for [mesh
59+
shaders](https://github.com/Rust-GPU/rust-gpu/pull/44).
60+
61+
[Mesh shaders](https://www.khronos.org/blog/mesh-shading-for-vulkan) are a modern GPU
62+
feature that replace traditional vertex and geometry shaders. They give GPU developers
63+
more control over the entire pipeline by letting them directly process batches of
64+
vertices and primitives in compute-like shaders. This allows for more efficient culling,
65+
level-of-detail calculations, and custom pipeline logic—all on the GPU.
66+
67+
An example of a Rust GPU mesh shader that outputs points:
68+
69+
```
70+
use spirv_std::arch::set_mesh_outputs_ext;
71+
use spirv_std::glam::{UVec2, Vec4};
72+
use spirv_std::spirv;
73+
74+
#[spirv(mesh_ext(
75+
threads(1),
76+
output_vertices = 1,
77+
output_primitives_ext = 1,
78+
output_points
79+
))]
80+
pub fn main(
81+
#[spirv(position)] positions: &mut [Vec4; 1],
82+
#[spirv(primitive_point_indices_ext)] indices: &mut [u32; 1],
83+
) {
84+
unsafe {
85+
set_mesh_outputs_ext(1, 1);
86+
}
87+
88+
positions[0] = Vec4::new(-0.5, 0.5, 0.0, 1.0);
89+
90+
indices[0] = 0;
91+
}
92+
```
93+
94+
An example of a Rust GPU mesh task shader:
95+
96+
```
97+
use spirv_std::arch::emit_mesh_tasks_ext;
98+
use spirv_std::spirv;
99+
100+
#[spirv(task_ext(threads(1)))]
101+
pub fn main() {
102+
unsafe {
103+
emit_mesh_tasks_ext(1, 2, 3);
104+
}
105+
}
106+
```
107+
108+
### **Subgroup support**
109+
110+
[@Firestar99](https://github.com/firestar99) also added support for subgroups via
111+
[subgroup intrinsics](https://github.com/Rust-GPU/rust-gpu/pull/14).
112+
113+
[Subgroups](https://www.khronos.org/blog/vulkan-subgroup-tutorial) are small groups of
114+
threads within a workgroup that can share data and perform synchronized operations more
115+
efficiently. For example, using subgroup intrinsics you can:
116+
117+
- Perform reductions (e.g., sum, min, max) across threads in a subgroup.
118+
- Share intermediate results without relying on global memory, reducing latency.
119+
- Implement algorithms like prefix sums or parallel sorting more effectively.
120+
121+
Here is a simple Rust GPU example to demonstrate subgroup reduction:
122+
123+
```rust
124+
use glam::UVec3;
125+
use spirv_std::spirv;
126+
127+
unsafe fn subgroup_i_add_reduce(value: u32) -> u32 {
128+
spirv_std::arch::subgroup_i_add(value)
129+
}
130+
131+
#[spirv(compute(threads(32, 1, 1)))]
132+
pub fn main(#[spirv(local_invocation_id)] local_invocation_id: UVec3) {
133+
unsafe {
134+
subgroup_i_add_reduce(local_invocation_id.x);
135+
}
136+
}
137+
```
138+
139+
## Added `TypedBuffer`
140+
141+
[@eddyb](https://github.com/eddyb) and [@Firestar99](https://github.com/firestar99)
142+
[introduced `TypedBuffer`](https://github.com/Rust-GPU/rust-gpu/pull/16), an explicit
143+
way to declare inputs and outputs as buffers. This enables declaring an "array of buffer
144+
descriptors containing something" as is common in [bindless
145+
textures](https://computergraphics.stackexchange.com/questions/10794/binding-vs-bindless).
146+
147+
Here is an example of using
148+
[`TypedBuffer`](https://rust-gpu.github.io/rust-gpu/api/spirv_std/struct.TypedBuffer.html)
149+
in a fragment shader:
150+
151+
```rust
152+
use glam::Vec4;
153+
use spirv_std::TypedBuffer;
154+
use spirv_std::spirv;
155+
156+
#[spirv(fragment)]
157+
pub fn main(
158+
#[spirv(storage_buffer, descriptor_set = 0, binding = 0)] single: &TypedBuffer<Vec4>,
159+
#[spirv(storage_buffer, descriptor_set = 0, binding = 1)] single_mut: &mut TypedBuffer<Vec4>,
160+
) {
161+
**single_mut = **single;
162+
}
163+
```
164+
165+
### Read-only buffer support for `ByteAddressableBuffer`
166+
167+
Thanks to [@Firestar99](https://github.com/firestar99),
168+
[`ByteAddressableBuffer`](https://rust-gpu.github.io/rust-gpu/api/spirv_std/byte_addressable_buffer/struct.ByteAddressableBuffer.html)
169+
now supports [reading from read-only
170+
buffers](https://github.com/Rust-GPU/rust-gpu/pull/17). Previously the buffers needed to
171+
be read-write. Using read-only buffers can improve performance for immutable data.
172+
173+
### Dependency updates
174+
175+
We updated key GPU dependencies like [`glam`](https://github.com/bitshifter/glam-rs).
176+
One of the unique benefits of Rust on the GPU is that we use the exact `glam` crate from
177+
[crates.io](https://crates.io/crates/glam), so this was a simple `Cargo.toml` update.
178+
179+
Additionally, examples now use the latest versions of CPU-side crates such as
180+
[`ash`](https://github.com/ash-rs/ash) and [`wgpu`](https://github.com/gfx-rs/wgpu).
181+
182+
## Other related changes
183+
184+
### SPIR-V atomics in `wgpu`
185+
186+
Rust GPU maintainer [@schell](https://github.com/schell) added [SPIR-V atomic support to
187+
`wgpu`](https://github.com/gfx-rs/wgpu/issues/4489). This was part of his work on
188+
[`renderling`](https://github.com/schell/renderling), a project built with Rust GPU. The
189+
change enables Rust GPU programs to use atomics and integrate with CPU-side code managed
190+
by [`wgpu`](https://github.com/gfx-rs/wgpu). Funding came from a grant by
191+
[NLnet](https://nlnet.nl/).
192+
193+
### Rustlantis integration
194+
195+
[@FractalFir](https://github.com/FractalFir) created
196+
[`rustc_codegen_clr`](https://github.com/FractalFir/rustc_codegen_clr), an experimental
197+
Rust compiler backend that converts Rust into .NET assemblies or C source files. He
198+
adapted [Rustlantis](https://github.com/cbeuw/rustlantis), a MIR fuzzer for generating
199+
complex test programs, to support his project.
200+
201+
When Rust GPU maintainers asked if the changes could help Rust GPU,
202+
[`@FractalFir`](https://github.com/FractalFir) took the extra step of updating his
203+
Rustlantis fork to support it as well. This collaboration has already uncovered three
204+
issues in Rust GPU. We plan to continue investing in Rustlantis support to improve
205+
automated testing and actively hunt for bugs.
206+
207+
### New website
208+
209+
Rust GPU maintainer [@LegNeato](https://github.com/LegNeato) added a [new website for
210+
the project](https://rust-gpu.github.io/) using [Docusaurus](https://docusaurus.io/). He
211+
also created some Docusaurus
212+
[plugins](https://github.com/Rust-GPU/rust-gpu.github.io/tree/main/src/plugins) and
213+
[components](https://github.com/Rust-GPU/rust-gpu.github.io/tree/main/src/components/Snippet)
214+
to better support the project's needs. Finally, he wrote a blog post about [optimizing a
215+
Rust GPU matmul kernel](/blog/optimizing-matmul) that was popular on
216+
[Reddit](https://www.reddit.com/r/rust/comments/1gzmchn/optimizing_a_rust_gpu_matmul_kernel/)
217+
and [Hacker News](https://news.ycombinator.com/item?id=42280697).
218+
219+
## Community
220+
221+
Thank you to the 13 community contributors, most of whom contributed for the first time:
222+
223+
[BeastLe9enD](https://github.com/BeastLe9enD), [beef
224+
(`@fee1-dead`)](https://github.com/fee1-dead), [Brice Videau
225+
(`@Kerilk`)](https://github.com/Kerilk) [Bruce Mitchener
226+
(`@waywardmonkeys`)](https://github.com/waywardmonkeys),
227+
[`@FractalFir`](https://github.com/FractalFir), [Fredrik Fornwall
228+
(`@fornwall`)](https://github.com/fornwall), [Gray Olson
229+
(`@fu5ha`)](https://github.com/fu5ha), [Jake Shadle](https://github.com/Jake-Shadle),
230+
[Léo Gaspard (`@Ekleog`)](https://github.com/Ekleog), [Rowan Jones
231+
(`@ArrEssJay`)](https://github.com/ArrEssJay), [Marek Bernat
232+
(`@mbernat`)](https://github.com/mbernat), [Viktor Zoutman
233+
(`@VZout`)](https://github.com/VZout), [`@Zanciks`](https://github.com/zanciks)
234+
235+
We're especially grateful that [`@Zanciks`](https://github.com/Zanciks) chose Rust GPU for
236+
their first ever open source contribution!
237+
238+
## Maintainers
239+
240+
As [previously announced](/blog/transition-announcement), Rust GPU has four active
241+
maintainers who contributed to this release (in alphabetical order):
242+
243+
1. [Christian Legnitto (LegNeato)](https://github.com/LegNeato)
244+
2. [Eduard-Mihai Burtescu (eddyb)](https://github.com/eddyb)
245+
3. [Firestar99](https://github.com/firestar99)
246+
4. [Schell Carl Scivally (schell)](https://github.com/schell)
247+
248+
<br/>
249+
250+
We're always looking for active contributors to become new maintainers. [Join us](https://github.com/rust-gpu/rust-gpu) and make an impact!

0 commit comments

Comments
 (0)