JuliaGPU / JuliaGPU/Metal.jl

Better error message for mixing MtlArray and Array operations

Open
#212 0 comments 0 reactions 0 assignees View on GitHub
arrays
Dominant language
Julia
Stars
463
Forks
68
Avg merge
1d 19m
Merged PRs (30d)
32

Description

Here, a is MtlVector and b is Vector. I imagine we don't want people to mix these things and work automatically. Perhaps the error message could be simpler.

```
julia> a .+ b
ERROR: GPU compilation of MethodInstance for (::GPUArrays.var"#broadcast_kernel#26")(::Metal.mtlKernelContext, ::MtlDeviceVector{Float32, 1}, ::Base.Broadcast.Broadcasted{Metal.MtlArrayStyle{1}, Tuple{Base.OneTo{Int64}}, typeof(+), Tuple{Base.Broadcast.Extruded{MtlDeviceVector{Float32, 1}, Tuple{Bool}, Tuple{Int64}}, Base.Broadcast.Extruded{Vector{Float32}, Tuple{Bool}, Tuple{Int64}}}}, ::Int64) failed
KernelError: passing and using non-bitstype argument

Argument 4 to your kernel function is of type Base.Broadcast.Broadcasted{Metal.MtlArrayStyle{1}, Tuple{Base.OneTo{Int64}}, typeof(+), Tuple{Base.Broadcast.Extruded{MtlDeviceVector{Float32, 1}, Tuple{Bool}, Tuple{Int64}}, Base.Broadcast.Extruded{Vector{Float32}, Tuple{Bool}, Tuple{Int64}}}}, which is not isbits:
.args is of type Tuple{Base.Broadcast.Extruded{MtlDeviceVector{Float32, 1}, Tuple{Bool}, Tuple{Int64}}, Base.Broadcast.Extruded{Vector{Float32}, Tuple{Bool}, Tuple{Int64}}} which is not isbits.
.2 is of type Base.Broadcast.Extruded{Vector{Float32}, Tuple{Bool}, Tuple{Int64}} which is not isbits.
.x is of type Vector{Float32} which is not isbits.

Stacktrace:
[1] check_invocation(job::GPUCompiler.CompilerJob)
@ GPUCompiler ~/.julia/packages/GPUCompiler/NVLGB/src/validation.jl:96
[2] macro expansion
@ ~/.julia/packages/GPUCompiler/NVLGB/src/driver.jl:99 [inlined]
[3] macro expansion
@ ~/.julia/packages/TimerOutputs/RsWnF/src/TimerOutput.jl:253 [inlined]
[4] codegen(output::Symbol, job::GPUCompiler.CompilerJob; libraries::Bool, toplevel::Bool, optimize::Bool, cleanup::Bool, strip::Bool, validate::Bool, only_entry::Bool, parent_job::Nothing, ctx::LLVM.ThreadSafeContext)
@ GPUCompiler ~/.julia/packages/GPUCompiler/NVLGB/src/driver.jl:97
[5] codegen
@ ~/.julia/packages/GPUCompiler/NVLGB/src/driver.jl:92 [inlined]
[6] compile(target::Symbol, job::GPUCompiler.CompilerJob; libraries::Bool, toplevel::Bool, optimize::Bool, cleanup::Bool, strip::Bool, validate::Bool, only_entry::Bool, ctx::LLVM.ThreadSafeContext)
@ GPUCompiler ~/.julia/packages/GPUCompiler/NVLGB/src/driver.jl:88
[7] compile
@ ~/.julia/packages/GPUCompiler/NVLGB/src/driver.jl:79 [inlined]
[8] compile(job::GPUCompiler.CompilerJob, ctx::LLVM.ThreadSafeContext)
@ Metal ~/.julia/packages/Metal/9shJi/src/compiler/compilation.jl:59
[9] #60
@ ~/.julia/packages/Metal/9shJi/src/compiler/compilation.jl:55 [inlined]
[10] LLVM.ThreadSafeContext(f::Metal.var"#60#61"{GPUCompiler.CompilerJob{GPUCompiler.MetalCompilerTarget, Metal.MetalCompilerParams}})
@ LLVM ~/.julia/packages/LLVM/5aiiG/src/executionengine/ts_module.jl:14
[11] JuliaContext
@ ~/.julia/packages/GPUCompiler/NVLGB/src/driver.jl:35 [inlined]
[12] compile
@ ~/.julia/packages/Metal/9shJi/src/compiler/compilation.jl:54 [inlined]
[13] actual_compilation(cache::Dict{Any, Any}, src::Core.MethodInstance, world::UInt64, cfg::GPUCompiler.CompilerConfig{GPUCompiler.MetalCompilerTarget, Metal.MetalCompilerParams}, compiler::typeof(Metal.compile), linker::typeof(Metal.link))
@ GPUCompiler ~/.julia/packages/GPUCompiler/NVLGB/src/execution.jl:125
[14] cached_compilation(cache::Dict{Any, Any}, src::Core.MethodInstance, cfg::GPUCompiler.CompilerConfig{GPUCompiler.MetalCompilerTarget, Metal.MetalCompilerParams}, compiler::Function, linker::Function)
@ GPUCompiler ~/.julia/packages/GPUCompiler/NVLGB/src/execution.jl:103
[15] macro expansion
@ ~/.julia/packages/Metal/9shJi/src/compiler/execution.jl:162 [inlined]
[16] macro expansion
@ ./lock.jl:267 [inlined]
[17] mtlfunction(f::GPUArrays.var"#broadcast_kernel#26", tt::Type{Tuple{Metal.mtlKernelContext, MtlDeviceVector{Float32, 1}, Base.Broadcast.Broadcasted{Metal.MtlArrayStyle{1}, Tuple{Base.OneTo{Int64}}, typeof(+), Tuple{Base.Broadcast.Extruded{MtlDeviceVector{Float32, 1}, Tuple{Bool}, Tuple{Int64}}, Base.Broadcast.Extruded{Vector{Float32}, Tuple{Bool}, Tuple{Int64}}}}, Int64}}; name::Nothing, kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
@ Metal ~/.julia/packages/Metal/9shJi/src/compiler/execution.jl:157
[18] mtlfunction
@ ~/.julia/packages/Metal/9shJi/src/compiler/execution.jl:155 [inlined]
[19] macro expansion
@ ~/.julia/packages/Metal/9shJi/src/compiler/execution.jl:77 [inlined]
[20] #launch_heuristic#107
@ ~/.julia/packages/Metal/9shJi/src/gpuarrays.jl:14 [inlined]
[21] launch_heuristic
@ ~/.julia/packages/Metal/9shJi/src/gpuarrays.jl:12 [inlined]
[22] _copyto!
@ ~/.julia/packages/GPUArrays/t0LfC/src/host/broadcast.jl:65 [inlined]
[23] copyto!
@ ~/.julia/packages/GPUArrays/t0LfC/src/host/broadcast.jl:46 [inlined]
[24] copy
@ ~/.julia/packages/GPUArrays/t0LfC/src/host/broadcast.jl:37 [inlined]
[25] materialize(bc::Base.Broadcast.Broadcasted{Metal.MtlArrayStyle{1}, Nothing, typeof(+), Tuple{MtlVector{Float32}, Vector{Float32}}})
@ Base.Broadcast ./broadcast.jl:873
[26] top-level scope
@ REPL[16]:1
[27] top-level scope
@ ~/.julia/packages/Metal/9shJi/src/initialization.jl:51

```

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.