Open
Description
(This is not really an Atomix issue but it's not clear where to track this.)
Currently, LLVM does not seem to select atomic store and load on CUDA (see Examples below). Until it is fixed in LLVM, as a short-term solution, it may be nice to use @device_override
in CUDA.jl to emit appropriate device-specific instructions through LLVM.Interop.atomic_pointer*
APIs.
Ref:
JuliaGPU/CUDA.jl#1353
JuliaGPU/CUDA.jl#1393
Workaround
If you really need to establish some atomic ordering semantics, sometimes it can be done by using some stronger operations such as:
x = Atomix.@atomic xs[i] += 0 # load (for numeric elements)
Atomix.@atomicswap xs[i] = x # store
Examples
julia> function load(xs)
Atomix.@atomic xs[1]
nothing
end;
julia> @cuda load(CUDA.zeros(1))
ERROR: LLVM error: Cannot select: 0x6b13098: f32,ch = AtomicLoad<(load seq_cst 4 from %ir.2, addrspace
1)> 0x704a6d8, 0x6b13b90, /home/tkf/.julia/packages/LLVM/YSJ2s/src/interop/base.jl:45 @[ /home/tkf/.jul
ia/packages/LLVM/YSJ2s/src/interop/atomics.jl:166 @[ /home/tkf/.julia/packages/LLVM/YSJ2s/src/interop/a
tomics.jl:166 @[ /home/tkf/.julia/packages/UnsafeAtomicsLLVM/i4GMj/src/internal.jl:7 @[ /home/tkf/.juli
a/packages/Atomix/F9VIX/src/core.jl:5 @[ REPL[11]:2 ] ] ] ] ]
0x6b13b90: i64,ch = CopyFromReg 0x704a6d8, Register:i64 %0, abstractarray.jl:656 @[ /home/tkf/.julia/
packages/Atomix/F9VIX/src/references.jl:95 @[ REPL[11]:2 ] ]
0x6b12fc8: i64 = Register %0
julia> function store!(xs)
Atomix.@atomic xs[1] = zero(eltype(xs))
nothing
end;
julia> @cuda store!(CUDA.zeros(1))
ERROR: LLVM error: Cannot select: 0x854a080: ch = AtomicStore<(store seq_cst 4 into %ir.2, addrspace 1)
> 0x863d288, 0x85273f0, ConstantFP:f32<0.000000e+00>, /home/tkf/.julia/packages/LLVM/YSJ2s/src/interop/
base.jl:45 @[ /home/tkf/.julia/packages/LLVM/YSJ2s/src/interop/atomics.jl:245 @[ /home/tkf/.julia/packa
ges/LLVM/YSJ2s/src/interop/atomics.jl:201 @[ /home/tkf/.julia/packages/UnsafeAtomicsLLVM/i4GMj/src/inte
rnal.jl:11 @[ /home/tkf/.julia/packages/Atomix/F9VIX/src/core.jl:14 @[ REPL[13]:2 ] ] ] ] ]
0x85273f0: i64,ch = CopyFromReg 0x863d288, Register:i64 %0, abstractarray.jl:656 @[ /home/tkf/.julia/
packages/Atomix/F9VIX/src/references.jl:95 @[ REPL[13]:2 ] ]
0x854a220: i64 = Register %0
0x8527ad8: f32 = ConstantFP<0.000000e+00>
(jl_4BkM8Y) pkg> st
Status `/tmp/jl_4BkM8Y/Project.toml`
[a9b6321e] Atomix v0.1.0
[052768ef] CUDA v3.10.1
[d80eeb9a] UnsafeAtomicsLLVM v0.1.0
julia> versioninfo()
Julia Version 1.7.2
Commit bf53498635 (2022-02-06 15:21 UTC)
Platform Info:
OS: Linux (x86_64-pc-linux-gnu)
CPU: Intel(R) Xeon(R) CPU E5-2603 v4 @ 1.70GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-12.0.1 (ORCJIT, broadwell)
Metadata
Metadata
Assignees
Labels
No labels