# Element-wise operations in Tullio.jl on GPU

**URL:** <https://discourse.julialang.org/t/element-wise-operations-in-tullio-jl-on-gpu/72186>\
**Category:** Numerics\
**Tags:** gpu, tullio\
**Created:** [November 28, 2021, 5:34am UTC](https://discourse.julialang.org/t/element-wise-operations-in-tullio-jl-on-gpu/72186 "2021-11-28T05:34:43Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![cuihantao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cuihantao/32/8783_2.png) [@cuihantao](https://discourse.julialang.org/u/cuihantao)\
**Post date:** [November 28, 2021, 5:34am UTC](https://discourse.julialang.org/t/element-wise-operations-in-tullio-jl-on-gpu/72186/1 "2021-11-28T05:34:43Z")

</div>

Hello,

I wonder what is the correct way to implement element-wise operations in Tullio.jl on GPU. The MWE is as follows:

```julia
using CUDA, Tullio
using BenchmarkTools

mul(A, B, C) = @tullio C[k] = A[k] * B[k]

a = rand(80000);
b = rand(80000);
c = similar(b);

@btime mul($a, $b, $c); # works fine on CPU
@btime mul($d_a, $d_b, $d_c); # fails: Scalar indexing is disallowed

```

I’m aware of another implementation without Tullio such as `@. d_c = d_a * d_b;`, but I just wonder if and how it can be done with Tullio.

Thanks!

---

<div class="post-metadata">

**Author:** ![mcabbott](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mcabbott/32/6603_2.png) [@mcabbott](https://discourse.julialang.org/u/mcabbott)\
**Post date:** [November 28, 2021, 3:15pm UTC](https://discourse.julialang.org/t/element-wise-operations-in-tullio-jl-on-gpu/72186/2 "2021-11-28T15:15:45Z")

</div>

Not the most friendly error message, but what you need to do is to load some extra packages:

```julia
julia> using KernelAbstractions, CUDAKernels

julia> CUDA.allowscalar(false);

julia> mul(A, B, C) = @tullio C[k] = A[k] * B[k]; # run macro after loading packages

julia> d_a, d_b, d_c = cu.((a, b, c));

julia> @btime mul($d_a, $d_b, $d_c);
  min 34.842 μs, mean 48.070 μs (86 allocations, 3.33 KiB)

julia> @btime CUDA.@sync mul($d_a, $d_b, $d_c);
  min 43.031 μs, mean 108.234 μs (86 allocations, 3.33 KiB)

julia> @btime CUDA.@sync $d_c .= $d_a .* $d_b; 
  min 17.036 μs, mean 176.596 μs (7 allocations, 480 bytes)

julia> @btime mul($a, $b, $c); # CPU
  min 122.099 μs, mean 123.461 μs (2 allocations, 32 bytes)

julia> c ≈ collect(d_c)
true

```

---

<div class="post-metadata">

**Author:** ![cuihantao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cuihantao/32/8783_2.png) [@cuihantao](https://discourse.julialang.org/u/cuihantao)\
**Post date:** [November 28, 2021, 3:34pm UTC](https://discourse.julialang.org/t/element-wise-operations-in-tullio-jl-on-gpu/72186/3 "2021-11-28T15:34:47Z")

</div>

I see. I noticed them while reading the README but didn’t connect them with the error.
