Confusing "cannot use `AtomicOrdering::SeqCst` on Vulkan memory model"
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 3.4k
- Forks
- 125
- PR merge metrics
- No merged PRs in 30d
Description
I'm getting the following error when trying to use AtomicU32:
error: cannot use `AtomicOrdering::SeqCst` on Vulkan memory model (check if `AcqRel` fits your needs)
--> /home/nazar-pc/.rustup/toolchains/nightly-2025-06-23-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/sync/atomic.rs:3984:23
|
3984 | SeqCst => intrinsics::atomic_xadd::<T, { AO::SeqCst }>(dst, val),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: used from within `core::sync::atomic::atomic_add::<u32>`
--> /home/nazar-pc/.rustup/toolchains/nightly-2025-06-23-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/sync/atomic.rs:3984:23
|
3984 | SeqCst => intrinsics::atomic_xadd::<T, { AO::SeqCst }>(dst, val),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: called by `<core::sync::atomic::AtomicU32>::fetch_add`
--> /home/nazar-pc/.rustup/toolchains/nightly-2025-06-23-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/sync/atomic.rs:3748:1
|
3748 | / atomic_int! {
3749 | | cfg(target_has_atomic = "32"),
3750 | | cfg(target_has_atomic_equal_alignment = "32"),
3751 | | stable(feature = "integer_atomics_stable", since = "1.34.0"),
... |
3764 | | u32 AtomicU32
3765 | | }
| |_^
note: called by `ab_proof_of_space_gpu::shader::find_matches_in_buckets::log_message`
--> crates/farmer/ab-proof-of-space-gpu/src/shader/find_matches_in_buckets.rs:109:34
|
109 | let write_at = debug_counter.fetch_add(message_length, Ordering::Relaxed);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The confusing part is that I'm not using SeqCst. Looks like the code that references SeqCst is technically compiled in and causes issues even though it is practically unreachable.
Would have been nice for it to compile successfully.
After above failure I tried spirv_std::arch::atomic_i_add(), which did work, but it has a bit strange syntax due to the need to provide not just ordering semantics, but also scope and it doesn't work on AtomicU32, only on u32. It is also unsafe for some reason.
Ultimately I think the error should say to use spirv_std::arch::atomic_i_add() (because I don't think hiding/guessing scope is a great idea) and spirv_std::arch::atomic_i_add() should support Atomic32, which has the same memory layout as regular u32.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with crates/farmer/ab-proof-of-space-gpu/src/shader/find_matches_in_buckets.rs at the AtomicU32 fetch_add call around line 109, then inspect the reported SeqCst diagnostic and spirv_std::arch::atomic_i_add(). Determine how Vulkan atomic ordering is handled and whether AtomicU32 support can be addressed. Done means the reported use case compiles or the error clearly directs users to the supported atomic operation.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100