Skip to content

Instruction selection error from loads and stores on CUDA #33

Open
@tkf

Description

@tkf

(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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions