# CUDA.@atomic causes type instability?

**URL:** https://discourse.julialang.org/t/cuda-atomic-causes-type-instability/72224
**Category:** GPU
**Tags:** question
**Created:** [November 29, 2021, 7:51am UTC](https://discourse.julialang.org/t/cuda-atomic-causes-type-instability/72224 "2021-11-29T07:51:00Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![guyvdb](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/guyvdb/32/11596_2.png) [@guyvdb](https://discourse.julialang.org/u/guyvdb)
#### Post date: [November 29, 2021, 7:51am UTC](https://discourse.julialang.org/t/cuda-atomic-causes-type-instability/72224/1 "2021-11-29T07:51:00Z")

</div>

I am not sure why adding `CUDA.@atomic` in the below code causes an error?

```julia
# works fine without CUDA.@atomic
function f(test)
    broadcast(CuVector(1:2), transpose(CuVector(1:3))) do i,j
        v::Float32 = j
        test[i] += v
    end
end

f(CUDA.zeros(Float32,2))

# ERROR with CUDA.@atomic
function g(test)
    broadcast(CuVector(1:2), transpose(CuVector(1:3))) do i,j
        v::Float32 = j
        CUDA.@atomic test[i] += v 
    end
end

g(CUDA.zeros(Float32,2))

```

```julia
ERROR: LoadError: GPU broadcast resulted in non-concrete element type Union{}.
This probably means that the function you are broadcasting contains an error or type instability.
Stacktrace:
 [1] error(s::String)
   @ Base ./error.jl:33
 [2] copy
   @ ~/.julia/packages/GPUArrays/3sW6s/src/host/broadcast.jl:44 [inlined]
 [3] materialize
   @ ./broadcast.jl:883 [inlined]
 [4] broadcast(::var"#45#46"{CuArray{Float32, 1, CUDA.Mem.DeviceBuffer}}, ::CuArray{Int64, 1, CUDA.Mem.DeviceBuffer}, ::LinearAlgebra.Transpose{Int64, CuArray{Int64, 1, CUDA.Mem.DeviceBuffer}})
   @ Base.Broadcast ./broadcast.jl:821
 [5] g(test::CuArray{Float32, 1, CUDA.Mem.DeviceBuffer})

```

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [November 29, 2021, 8:10am UTC](https://discourse.julialang.org/t/cuda-atomic-causes-type-instability/72224/2 "2021-11-29T08:10:15Z")

</div>

> `GPU broadcast resulted in non-concrete element type Union{}.`

A return value of `Union{}` means that the function throws. Are you sure this is correct usage of `CUDA.@atomic`? For example:

```julia
julia> test = CuArray([1,2,3]);

julia> CUDA.@atomic test[1] += 1
ERROR: MethodError: no method matching atomic_add!(::CuPtr{Int64}, ::Int64)
Closest candidates are:
  atomic_add!(::Union{Core.LLVMPtr{Int64, 0}, Core.LLVMPtr{Int64, 1}, Core.LLVMPtr{Int64, 3}}, ::Int64) at ...

```

---

<div class="post-metadata">

### Author: ![maleadt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maleadt/32/10097_2.png) [@maleadt](https://discourse.julialang.org/u/maleadt)
#### Post date: [November 29, 2021, 9:02am UTC](https://discourse.julialang.org/t/cuda-atomic-causes-type-instability/72224/3 "2021-11-29T09:02:58Z")

</div>

`CUDA.@atomic` only works in kernel context.

This usage looks OK, so try in a regular kernel where you can use `@device_code_warntype` to look at what’s wrong instead of our `broadcast` implementation here just bailing out.

---

<div class="post-metadata">

### Author: ![guyvdb](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/guyvdb/32/11596_2.png) [@guyvdb](https://discourse.julialang.org/u/guyvdb)
#### Post date: [November 29, 2021, 5:26pm UTC](https://discourse.julialang.org/t/cuda-atomic-causes-type-instability/72224/4 "2021-11-29T17:26:36Z")

</div>

Thanks, I was being lazy using `broadcast` to sidestep the need to manually launch a kernel, call occupancy API, assign blocks and threads, etc 😃

---

<div class="post-metadata">

### Author: ![maleadt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maleadt/32/10097_2.png) [@maleadt](https://discourse.julialang.org/u/maleadt)
#### Post date: [November 29, 2021, 5:31pm UTC](https://discourse.julialang.org/t/cuda-atomic-causes-type-instability/72224/5 "2021-11-29T17:31:05Z")

</div>

It’s a pattern that should probably work though, so feel free to open an issue about it as well!

---

<div class="post-metadata">

### Author: ![guyvdb](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/guyvdb/32/11596_2.png) [@guyvdb](https://discourse.julialang.org/u/guyvdb)
#### Post date: [November 29, 2021, 6:27pm UTC](https://discourse.julialang.org/t/cuda-atomic-causes-type-instability/72224/6 "2021-11-29T18:27:31Z")

</div>

Done: [https://github.com/JuliaGPU/CUDA.jl/issues/1253](https://github.com/JuliaGPU/CUDA.jl/issues/1253)
