Skip to content

Use with CUDAnative #86

@lcw

Description

@lcw

Thanks for the cool package! This package seems to work as expected on the CPU and now I am trying to push things to the GPU.

Following the example in the README, I tried to use a StructArray in a simple CUDAnative copy kernel, see

using CUDAnative, CuArrays, StaticArrays, StructArrays                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

c = [SHermitianCompact(@SVector(rand(3))) for i=1:5]
d = StructArray(c, unwrap = t -> t <: Union{SVector,Tuple,SHermitianCompact})

dd = replace_storage(CuArray, d)
de = similar(dd)

@show typeof(dd)

function kernel!(dest, src)
  i = (blockIdx().x-1)*blockDim().x + threadIdx().x
  if i <= length(dest)
    dest[i] = src[i]
  end
  return nothing
end

threads = 1024
blocks = cld(length(dd),threads)

@cuda threads=threads blocks=blocks kernel!(de, dd)

This resulted in the following error message

❯ julia --project=.
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.2.0 (2019-08-20)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> include("try.jl")
typeof(dd) = StructArray{SHermitianCompact{2,Float64,3},1,NamedTuple{(:lowertriangle,),Tuple{StructArray{SArray{Tuple{3},Float64,1,3},1,NamedTuple{(:data,),Tuple{StructArray{Tuple{Float64,Float64,Float64},1,Tuple{CuArray{Float64,1},CuArray{Float64,1},CuArray{Float64,1}},Int64}}},Int64}}},Int64}
ERROR: LoadError: GPU compilation of kernel!(StructArray{SHermitianCompact{2,Float64,3},1,NamedTuple{(:lowertriangle,),Tuple{StructArray{SArray{Tuple{3},Float64,1,3},1,NamedTuple{(:data,),Tuple{StructArray{Tuple{Float64,Float64,Float64},1,Tuple{CuArray{Float64,1},CuArray{Float64,1},CuArray{Float64,1}},Int64}}},Int64}}},Int64}, StructArray{SHermitianCompact{2,Float64,3},1,NamedTuple{(:lowertriangle,),Tuple{StructArray{SArray{Tuple{3},Float64,1,3},1,NamedTuple{(:data,),Tuple{StructArray{Tuple{Float64,Float64,Float64},1,Tuple{CuArray{Float64,1},CuArray{Float64,1},CuArray{Float64,1}},Int64}}},Int64}}},Int64}) failed
KernelError: passing and using non-bitstype argument

Argument 2 to your kernel function is of type StructArray{SHermitianCompact{2,Float64,3},1,NamedTuple{(:lowertriangle,),Tuple{StructArray{SArray{Tuple{3},Float64,1,3},1,NamedTuple{(:data,),Tuple{StructArray{Tuple{Float64,Float64,Float64},1,Tuple{CuArray{Float64,1},CuArray{Float64,1},CuArray{Float64,1}},Int64}}},Int64}}},Int64}.
That type is not isbits, and such arguments are only allowed when they are unused by the kernel.  .fieldarrays is of type NamedTuple{(:lowertriangle,),Tuple{StructArray{SArray{Tuple{3},Float64,1,3},1,NamedTuple{(:data,),Tuple{StructArray{Tuple{Float64,Float64,Float64},1,Tuple{CuArray{Float64,1},CuArray{Float64,1},CuArray{Float64,1}},Int64}}},Int64}}} which is not isbits.
    .lowertriangle is of type StructArray{SArray{Tuple{3},Float64,1,3},1,NamedTuple{(:data,),Tuple{StructArray{Tuple{Float64,Float64,Float64},1,Tuple{CuArray{Float64,1},CuArray{Float64,1},CuArray{Float64,1}},Int64}}},Int64} which is not isbits.
      .fieldarrays is of type NamedTuple{(:data,),Tuple{StructArray{Tuple{Float64,Float64,Float64},1,Tuple{CuArray{Float64,1},CuArray{Float64,1},CuArray{Float64,1}},Int64}}} which is not isbits.
        .data is of type StructArray{Tuple{Float64,Float64,Float64},1,Tuple{CuArray{Float64,1},CuArray{Float64,1},CuArray{Float64,1}},Int64} which is not isbits.
          .fieldarrays is of type Tuple{CuArray{Float64,1},CuArray{Float64,1},CuArray{Float64,1}} which is not isbits.
            .1 is of type CuArray{Float64,1} which is not isbits.
              .buf is of type CUDAdrv.Mem.Buffer which is not isbits.
            .2 is of type CuArray{Float64,1} which is not isbits.
              .buf is of type CUDAdrv.Mem.Buffer which is not isbits.
            .3 is of type CuArray{Float64,1} which is not isbits.
              .buf is of type CUDAdrv.Mem.Buffer which is not isbits.


Stacktrace:
 [1] check_invocation(::CUDAnative.CompilerJob, ::LLVM.Function) at /home/lucas/.julia/packages/CUDAnative/UWBIY/src/compiler/validation.jl:70
 [2] macro expansion at /home/lucas/.julia/packages/CUDAnative/UWBIY/src/compiler/driver.jl:187 [inlined]
 [3] macro expansion at /home/lucas/.julia/packages/TimerOutputs/7zSea/src/TimerOutput.jl:216 [inlined]
 [4] #codegen#130(::Bool, ::Bool, ::Bool, ::Bool, ::Bool, ::typeof(CUDAnative.codegen), ::Symbol, ::CUDAnative.CompilerJob) at /home/lucas/.julia/packages/CUDAnative/UWBIY/src/compiler/driver.jl:186
 [5] #codegen at /home/lucas/.julia/packages/CUDAnative/UWBIY/src/compiler/driver.jl:0 [inlined]
 [6] #compile#129(::Bool, ::Bool, ::Bool, ::Bool, ::Bool, ::typeof(CUDAnative.compile), ::Symbol, ::CUDAnative.CompilerJob) at /home/lucas/.julia/packages/CUDAnative/UWBIY/src/compiler/driver.jl:47
 [7] #compile#128 at ./none:0 [inlined]
 [8] #compile at ./none:0 [inlined] (repeats 2 times)
 [9] macro expansion at /home/lucas/.julia/packages/CUDAnative/UWBIY/src/execution.jl:389 [inlined]
 [10] #cufunction#170(::Nothing, ::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::typeof(cufunction), ::typeof(kernel!), ::Type{Tuple{StructArray{SHermitianCompact{2,Float64,3},1,NamedTuple{(:lowertriangle,),Tuple{StructArray{SArray{Tuple{3},Float64,1,3},1,NamedTuple{(:data,),Tuple{StructArray{Tuple{Float64,Float64,Float64},1,Tuple{CuArray{Float64,1},CuArray{Float64,1},CuArray{Float64,1}},Int64}}},Int64}}},Int64},StructArray{SHermitianCompact{2,Float64,3},1,NamedTuple{(:lowertriangle,),Tuple{StructArray{SArray{Tuple{3},Float64,1,3},1,NamedTuple{(:data,),Tuple{StructArray{Tuple{Float64,Float64,Float64},1,
Tuple{CuArray{Float64,1},CuArray{Float64,1},CuArray{Float64,1}},Int64}}},Int64}}},Int64}}}) at /home/lucas/.julia/packages/CUDAnative/UWBIY/src/execution.jl:357
 [11] cufunction(::Function, ::Type) at /home/lucas/.julia/packages/CUDAnative/UWBIY/src/execution.jl:357
 [12] top-level scope at /home/lucas/.julia/packages/CUDAnative/UWBIY/src/execution.jl:174
 [13] top-level scope at gcutils.jl:87
 [14] top-level scope at /home/lucas/.julia/packages/CUDAnative/UWBIY/src/execution.jl:171
 [15] include at ./boot.jl:328 [inlined]
 [16] include_relative(::Module, ::String) at ./loading.jl:1094
 [17] include(::Module, ::String) at ./Base.jl:31
 [18] include(::String) at ./client.jl:431
 [19] top-level scope at REPL[1]:1
in expression starting at /home/lucas/research/code/Heptapus.jl/examples/structarrays/try.jl:24

Is there a way to modify my example to be able to use the StructArray in CUDAnative? Thanks for any pointers you may have.

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