-
Notifications
You must be signed in to change notification settings - Fork 44
Closed
Description
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
Labels
No labels