Open
Description
MWE:
using LoopVectorization
spin_conf = rand((-1,1),64,64);
function get(spin_conf, x, y)
(Nx, Ny) = size(spin_conf)
@inbounds spin_conf[(x-1+Nx)%Nx + 1, (y-1+Ny)%Ny + 1]
end
function energy(spin_conf)
(Nx, Ny) = size(spin_conf)
res = 0
@avx for i = 1:Nx
for j = 1:Ny
res += -get(spin_conf,i,j)*(get(spin_conf,i+1,j) + get(spin_conf,i,j+1))
end
end
return res
end
Trying to run energy(spin_conf)
I get
julia> energy(spin_conf)
ERROR: ArgumentError: invalid index: VectorizationBase.Vec{4, Int64}<1, 2, 3, 4> of type VectorizationBase.Vec{4, Int64}
Stacktrace:
[1] to_index(i::VectorizationBase.Vec{4, Int64})
@ Base ./indices.jl:300
[2] to_index(A::Matrix{Int64}, i::VectorizationBase.Vec{4, Int64})
@ Base ./indices.jl:277
[3] to_indices
@ ./indices.jl:333 [inlined]
[4] to_indices
@ ./indices.jl:324 [inlined]
[5] getindex
@ ./abstractarray.jl:1170 [inlined]
[6] get(spin_conf::Matrix{Int64}, x::VectorizationBase.MM{4, 1, Int64}, y::Int64)
@ Main ./REPL[3]:3
[7] macro expansion
@ ~/.julia/packages/LoopVectorization/O8WW6/src/reconstruct_loopset.jl:630 [inlined]
[8] _avx_!
@ ~/.julia/packages/LoopVectorization/O8WW6/src/reconstruct_loopset.jl:630 [inlined]
[9] energy(spin_conf::Matrix{Int64})
@ Main ./REPL[4]:4
[10] top-level scope
@ REPL[6]:1
[11] eval_user_input(ast::Any, backend::REPL.REPLBackend)
@ REPL ~/.julia/sysimgs/std.so:-1
[12] repl_backend_loop(backend::REPL.REPLBackend)
@ REPL ~/.julia/sysimgs/std.so:-1
[13] start_repl_backend(backend::REPL.REPLBackend, consumer::Any)
@ REPL ~/.julia/sysimgs/std.so:-1
[14] run_repl(repl::REPL.AbstractREPL, consumer::Any; backend_on_current_task::Bool)
@ REPL ~/.julia/sysimgs/std.so:-1
[15] run_repl(repl::REPL.AbstractREPL, consumer::Any)
@ REPL ~/.julia/sysimgs/std.so:-1
[16] (::Base.var"#874#876"{Bool, Bool, Bool})(REPL::Module)
@ Base ~/.julia/sysimgs/std.so:-1
[17] run_main_repl(interactive::Bool, quiet::Bool, banner::Bool, history_file::Bool, color_set::Bool)
@ Base ~/.julia/sysimgs/std.so:-1
[18] exec_options(opts::Base.JLOptions)
@ Base ~/.julia/sysimgs/std.so:-1
[19] _start()
@ Base ~/.julia/sysimgs/std.so:-1
"Manually inlining" the get
function:
function energy(spin_conf)
(Nx, Ny) = size(spin_conf)
res = 0
@avx for i = 1:Nx
for j = 1:Ny
i0 = (i-1+Nx)%Nx
i1 = (i+Nx)%Nx
j0 = (j-1+Ny)%Ny
j1 = (j+Ny)%Ny
res += -spin_conf[i0,j0]*(spin_conf[i1,j0] + spin_conf[i0,j1])
end
end
return res
end
I obtain
julia> energy(spin_conf)
ERROR: MethodError: no method matching vrem_fast(::VectorizationBase.Vec{4, Int64}, ::VectorizationBase.Vec{4, Int64})
Stacktrace:
[1] rem_fast
@ ~/.julia/packages/VectorizationBase/ALPNu/src/base_defs.jl:87 [inlined]
[2] macro expansion
@ ~/.julia/packages/LoopVectorization/O8WW6/src/reconstruct_loopset.jl:630 [inlined]
[3] _avx_!(#unused#::Val{(false, 0, 0, false, 4, 32, 15, 64, 32768, 262144, 12582912, 0x0000000000000001)}, #unused#::Val{(:i, :i, LoopVectorization.OperationStruct(0x0000000000000001, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, LoopVectorization.loopvalue, 0x00, 0x01), :LoopVectorization, :LOOPCONSTANTINSTRUCTION, LoopVectorization.OperationStruct(0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, LoopVectorization.constant, 0x00, 0x02), :LoopVectorization, :-, LoopVectorization.OperationStruct(0x0000000000000001, 0x0000000000000000, 0x0000000000000000, 0x0000000000000102, LoopVectorization.compute, 0x00, 0x03), :LoopVectorization, :LOOPCONSTANTINSTRUCTION, LoopVectorization.OperationStruct(0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, LoopVectorization.constant, 0x00, 0x04), :LoopVectorization, :+, LoopVectorization.OperationStruct(0x0000000000000001, 0x0000000000000000, 0x0000000000000000, 0x0000000000000304, LoopVectorization.compute, 0x00, 0x05), :LoopVectorization, :rem_fast, LoopVectorization.OperationStruct(0x0000000000000001, 0x0000000000000000, 0x0000000000000000, 0x0000000000000504, LoopVectorization.compute, 0x00, 0x06), :LoopVectorization, :+, LoopVectorization.OperationStruct(0x0000000000000001, 0x0000000000000000, 0x0000000000000000, 0x0000000000000104, LoopVectorization.compute, 0x00, 0x07), :LoopVectorization, :rem_fast, LoopVectorization.OperationStruct(0x0000000000000001, 0x0000000000000000, 0x0000000000000000, 0x0000000000000704, LoopVectorization.compute, 0x00, 0x08), :j, :j, LoopVectorization.OperationStruct(0x0000000000000002, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, LoopVectorization.loopvalue, 0x00, 0x09), :LoopVectorization, :LOOPCONSTANTINSTRUCTION, LoopVectorization.OperationStruct(0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, LoopVectorization.constant, 0x00, 0x0a), :LoopVectorization, :-, LoopVectorization.OperationStruct(0x0000000000000002, 0x0000000000000000, 0x0000000000000000, 0x0000000000000902, LoopVectorization.compute, 0x00, 0x0b), :LoopVectorization, :LOOPCONSTANTINSTRUCTION, LoopVectorization.OperationStruct(0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, LoopVectorization.constant, 0x00, 0x0c), :LoopVectorization, :+, LoopVectorization.OperationStruct(0x0000000000000002, 0x0000000000000000, 0x0000000000000000, 0x0000000000000b0c, LoopVectorization.compute, 0x00, 0x0d), :LoopVectorization, :rem_fast, LoopVectorization.OperationStruct(0x0000000000000002, 0x0000000000000000, 0x0000000000000000, 0x0000000000000d0c, LoopVectorization.compute, 0x00, 0x0e), :LoopVectorization, :+, LoopVectorization.OperationStruct(0x0000000000000002, 0x0000000000000000, 0x0000000000000000, 0x000000000000090c, LoopVectorization.compute, 0x00, 0x0f), :LoopVectorization, :rem_fast, LoopVectorization.OperationStruct(0x0000000000000002, 0x0000000000000000, 0x0000000000000000, 0x0000000000000f0c, LoopVectorization.compute, 0x00, 0x10), :LoopVectorization, :getindex, LoopVectorization.OperationStruct(0x0000000000000012, 0x0000000000000000, 0x0000000000000000, 0x000000000000060e, LoopVectorization.memload, 0x01, 0x11), :LoopVectorization, :sub_fast, LoopVectorization.OperationStruct(0x0000000000000012, 0x0000000000000000, 0x0000000000000000, 0x0000000000000011, LoopVectorization.compute, 0x00, 0x12), :LoopVectorization, :getindex, LoopVectorization.OperationStruct(0x0000000000000012, 0x0000000000000000, 0x0000000000000000, 0x000000000000080e, LoopVectorization.memload, 0x02, 0x13), :LoopVectorization, :getindex, LoopVectorization.OperationStruct(0x0000000000000012, 0x0000000000000000, 0x0000000000000000, 0x0000000000000610, LoopVectorization.memload, 0x03, 0x14), :LoopVectorization, :+, LoopVectorization.OperationStruct(0x0000000000000012, 0x0000000000000000, 0x0000000000000000, 0x0000000000001314, LoopVectorization.compute, 0x00, 0x15), :LoopVectorization, :LOOPCONSTANTINSTRUCTION, LoopVectorization.OperationStruct(0x0000000000000000, 0x0000000000000000, 0x0000000000000012, 0x0000000000000000, LoopVectorization.constant, 0x00, 0x16), :LoopVectorization, :vfmadd_fast, LoopVectorization.OperationStruct(0x0000000000000012, 0x0000000000000012, 0x0000000000000000, 0x0000000000121516, LoopVectorization.compute, 0x00, 0x16))}, #unused#::Val{(LoopVectorization.ArrayRefStruct{:spin_conf, Symbol("##vptr##_spin_conf")}(0x0000000000000202, 0x000000000000060e, 0x0000000000000000, 0x0000000000000101), LoopVectorization.ArrayRefStruct{:spin_conf, Symbol("##vptr##_spin_conf")}(0x0000000000000202, 0x000000000000080e, 0x0000000000000000, 0x0000000000000101), LoopVectorization.ArrayRefStruct{:spin_conf, Symbol("##vptr##_spin_conf")}(0x0000000000000202, 0x0000000000000610, 0x0000000000000000, 0x0000000000000101))}, #unused#::Val{(0, (23,), (4, 12, 22), ((2, (1, 64, true)),), (), (), ())}, #unused#::Val{(:i, :j)}, tuple#args#::Tuple{Tuple{ArrayInterface.OptionallyStaticUnitRange{Static.StaticInt{1}, Int64}, ArrayInterface.OptionallyStaticUnitRange{Static.StaticInt{1}, Int64}}, Tuple{VectorizationBase.GroupedStridedPointers{Tuple{Ptr{Int64}}, (1,), (0,), ((1, 2),), ((1, 2),), Tuple{Static.StaticInt{8}, Int64}, Tuple{Static.StaticInt{1}, Static.StaticInt{1}}}, Int64, Int64, Int64}})
@ LoopVectorization ~/.julia/packages/LoopVectorization/O8WW6/src/reconstruct_loopset.jl:630
[4] energy(spin_conf::Matrix{Int64})
@ Main ./REPL[4]:4
[5] top-level scope
@ REPL[5]:1
[6] eval_user_input(ast::Any, backend::REPL.REPLBackend)
@ REPL ~/.julia/sysimgs/std.so:-1
[7] repl_backend_loop(backend::REPL.REPLBackend)
@ REPL ~/.julia/sysimgs/std.so:-1
[8] start_repl_backend(backend::REPL.REPLBackend, consumer::Any)
@ REPL ~/.julia/sysimgs/std.so:-1
[9] run_repl(repl::REPL.AbstractREPL, consumer::Any; backend_on_current_task::Bool)
@ REPL ~/.julia/sysimgs/std.so:-1
[10] run_repl(repl::REPL.AbstractREPL, consumer::Any)
@ REPL ~/.julia/sysimgs/std.so:-1
[11] (::Base.var"#874#876"{Bool, Bool, Bool})(REPL::Module)
@ Base ~/.julia/sysimgs/std.so:-1
[12] run_main_repl(interactive::Bool, quiet::Bool, banner::Bool, history_file::Bool, color_set::Bool)
@ Base ~/.julia/sysimgs/std.so:-1
[13] exec_options(opts::Base.JLOptions)
@ Base ~/.julia/sysimgs/std.so:-1
[14] _start()
@ Base ~/.julia/sysimgs/std.so:-1
Metadata
Metadata
Assignees
Labels
No labels