JuliaGPU / JuliaGPU/KernelAbstractions.jl

MethodError: no method matching __index_Local_Linear() from a CPU kernel

Open
#218 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Julia
Stars
523
Forks
88
Avg merge
1d 11h
Merged PRs (30d)
25

Description

I get MethodError: no method matching __index_Local_Linear() from code that I expect to work (g):

julia> @kernel function f(xs)
           i = @index(Local, Linear)
           xs[i] = 1
       end
f (generic function with 5 methods)

julia> @kernel function g(xs)
           xs[@index(Local, Linear)] = 1
       end
g (generic function with 5 methods)

julia> xs = zeros(3); f(CPU())(xs; ndrange = 3) |> wait; xs
3-element Array{Float64,1}:
 1.0
 1.0
 1.0

julia> xs = zeros(3); g(CPU())(xs; ndrange = 3) |> wait; xs
ERROR: TaskFailedException:
MethodError: no method matching __index_Local_Linear()

Looking at @macroexpand, the function f that works contains KernelAbstractions.__index_Local_Linear(var"##I#253") while the function gthat throws contains KernelAbstractions.__index_Local_Linear()


Full session

shell> git log -n1 --oneline
b2f7105 (HEAD -> master, origin/master) performant matmul example for KA (#208)

(@v1.5) pkg> activate .
 Activating environment at `~/.julia/dev/KernelAbstractions/Project.toml`

julia> using KernelAbstractions

julia> @macroexpand @kernel function f(xs)
           i = @index(Local, Linear)
           xs[i] = 1
       end
quote
    function cpu_f(xs; )
        let
            $(Expr(:aliasscope))
            begin
                var"##N#254" = length((KernelAbstractions.__workitems_iterspace)())
                begin
                    #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:262 =#
                    for var"##I#253" = (KernelAbstractions.__workitems_iterspace)()
                        #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:263 =#
                        (KernelAbstractions.__validindex)(var"##I#253") || continue
                        #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:264 =#
                        i = KernelAbstractions.__index_Local_Linear(var"##I#253")
                        #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:265 =#
                        xs[i] = 1
                    end
                end
            end
            $(Expr(:popaliasscope))
            return nothing
        end
    end
    function gpu_f(xs; )
        let
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:79 =#
            if (KernelAbstractions.__validindex)()
                #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:80 =#
                begin
                    #= REPL[5]:1 =#
                    #= REPL[5]:2 =#
                    i = KernelAbstractions.__index_Local_Linear()
                    #= REPL[5]:3 =#
                    xs[i] = 1
                end
            end
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:82 =#
            return nothing
        end
    end
    begin
        #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:52 =#
        if !($(Expr(:isdefined, :f)))
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:53 =#
            begin
                $(Expr(:meta, :doc))
                f(dev::Device) = begin
                        #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:53 =#
                        f(dev, (KernelAbstractions.NDIteration.DynamicSize)(), (KernelAbstractions.NDIteration.DynamicSize)())
                    end
            end
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:54 =#
            f(dev::Device, size) = begin
                    #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:54 =#
                    f(dev, (KernelAbstractions.NDIteration.StaticSize)(size), (KernelAbstractions.NDIteration.DynamicSize)())
                end
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:55 =#
            f(dev::Device, size, range) = begin
                    #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:55 =#
                    f(dev, (KernelAbstractions.NDIteration.StaticSize)(size), (KernelAbstractions.NDIteration.StaticSize)(range))
                end
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:56 =#
            function f(::Device, ::S, ::NDRange) where {Device <: CPU, S <: KernelAbstractions.NDIteration._Size, NDRange <: KernelAbstractions.NDIteration._Size}
                #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:56 =#
                #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:57 =#
                return (KernelAbstractions.Kernel){Device, S, NDRange, typeof(cpu_f)}(cpu_f)
            end
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:59 =#
            function f(::Device, ::S, ::NDRange) where {Device <: GPU, S <: KernelAbstractions.NDIteration._Size, NDRange <: KernelAbstractions.NDIteration._Size}
                #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:59 =#
                #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:60 =#
                return (KernelAbstractions.Kernel){Device, S, NDRange, typeof(gpu_f)}(gpu_f)
            end
        end
    end
end

julia> @macroexpand @kernel function g(xs)
           xs[@index(Local, Linear)] = 1
       end
quote
    function cpu_g(xs; )
        let
            $(Expr(:aliasscope))
            begin
                var"##N#256" = length((KernelAbstractions.__workitems_iterspace)())
                begin
                    #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:262 =#
                    for var"##I#255" = (KernelAbstractions.__workitems_iterspace)()
                        #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:263 =#
                        (KernelAbstractions.__validindex)(var"##I#255") || continue
                        #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:264 =#
                        #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:265 =#
                        xs[KernelAbstractions.__index_Local_Linear()] = 1
                    end
                end
            end
            $(Expr(:popaliasscope))
            return nothing
        end
    end
    function gpu_g(xs; )
        let
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:79 =#
            if (KernelAbstractions.__validindex)()
                #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:80 =#
                begin
                    #= REPL[6]:1 =#
                    #= REPL[6]:2 =#
                    xs[KernelAbstractions.__index_Local_Linear()] = 1
                end
            end
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:82 =#
            return nothing
        end
    end
    begin
        #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:52 =#
        if !($(Expr(:isdefined, :g)))
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:53 =#
            begin
                $(Expr(:meta, :doc))
                g(dev::Device) = begin
                        #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:53 =#
                        g(dev, (KernelAbstractions.NDIteration.DynamicSize)(), (KernelAbstractions.NDIteration.DynamicSize)())
                    end
            end
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:54 =#
            g(dev::Device, size) = begin
                    #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:54 =#
                    g(dev, (KernelAbstractions.NDIteration.StaticSize)(size), (KernelAbstractions.NDIteration.DynamicSize)())
                end
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:55 =#
            g(dev::Device, size, range) = begin
                    #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:55 =#
                    g(dev, (KernelAbstractions.NDIteration.StaticSize)(size), (KernelAbstractions.NDIteration.StaticSize)(range))
                end
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:56 =#
            function g(::Device, ::S, ::NDRange) where {Device <: CPU, S <: KernelAbstractions.NDIteration._Size, NDRange <: KernelAbstractions.NDIteration._Size}
                #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:56 =#
                #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:57 =#
                return (KernelAbstractions.Kernel){Device, S, NDRange, typeof(cpu_g)}(cpu_g)
            end
            #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:59 =#
            function g(::Device, ::S, ::NDRange) where {Device <: GPU, S <: KernelAbstractions.NDIteration._Size, NDRange <: KernelAbstractions.NDIteration._Size}
                #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:59 =#
                #= /home/arakaki/.julia/dev/KernelAbstractions/src/macros.jl:60 =#
                return (KernelAbstractions.Kernel){Device, S, NDRange, typeof(gpu_g)}(gpu_g)
            end
        end
    end
end

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with src/macros.jl around the @kernel expansion shown at lines 262-265, then reproduce the f and g CPU examples using @index(Local, Linear). Compare their @macroexpand output and run the relevant existing kernel tests; done means the inline index form works on CPU like the assigned-variable form without the MethodError.

Written by the indexing model from the issue text.

Assessment

Tech stack
julia
Domain
hpc
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.