Wrong results for overflowing Int16 arithmetic in a reduction kernel
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 45/100
Direzione di ricerca
The report points to AcceleratedKernels’ generic mapreducedim! kernel for sources without strides and the reductions/mapreducedim! test in GPUArrays 12. Start by reproducing the failing Complex{Int16} abs2 reduction and comparing the generic kernel’s generated code with the handwritten oneAPI kernels described here. Done means identifying and fixing the cause of the incorrect results, with a regression test covering overflowing values.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
On an Iris Xe (i7-1165G7), a reduction of abs2 over Complex{Int16} values gives wrong results when abs2 overflows Int16, in AcceleratedKernels' generic mapreducedim! kernel (the one used for sources without strides). Julia's IR is correct (wrapping mul i16/add i16 feeding llvm.smax.i16), so this looks like a miscompile further down, in the SPIR-V translation or IGC.
GPUArrays 12's testsuite hit it (reductions/mapreducedim!, Base.mapreducedim!(abs2, max, R, adjoint(A)) with Complex{Int16}). GPUArrays 12.0.1 keeps those values small.
using oneAPI
function check(label, gen, f)
bad = 0
for _ in 1:50
A = gen()
R0 = zeros(Int16, 1, 3)
mk = A -> view(permutedims(A), [1, 2, 3, 4], :) # not strided: AK's generic kernel
c = Base.mapreducedim!(f, max, copy(R0), mk(A))
g = Array(Base.mapreducedim!(f, max, oneArray(R0), mk(oneArray(A))))
c == g || (bad += 1)
end
println(rpad(label, 30), bad, "/50")
end
function main()
small = () -> complex.(rand(Int16(-100):Int16(100), 3, 4), rand(Int16(-100):Int16(100), 3, 4))
full = () -> rand(Complex{Int16}, 3, 4)
check("small abs2", small, abs2)
check("full abs2", full, abs2)
check("full re*re", full, x -> real(x) * real(x))
check("full re*re+im*im", full, x -> real(x) * real(x) + imag(x) * imag(x))
check("full re*im", full, x -> real(x) * imag(x))
end
main()
small abs2 0/50
full abs2 50/50
full re*re 0/50
full re*re+im*im 49/50
full re*im 0/50
The kernel's loop body, from @device_code_llvm:
%.unpack = load i16, ptr addrspace(1) %16, align 2
%.unpack73 = load i16, ptr addrspace(1) %.elt72, align 2
%17 = mul i16 %.unpack, %.unpack
%18 = mul i16 %.unpack73, %.unpack73
%19 = add i16 %18, %17
%20 = call i16 @llvm.smax.i16(i16 %19, i16 %value_phi24)
Hand-written @oneapi kernels with the same arithmetic (max over abs2 of Complex{Int16} loaded from a 2D array, with the seed passed as an argument or as a constant) compute the right result, so I couldn't reduce it below AK's kernel yet.
oneAPI 2.9.2 and the GPUArrays 12 port (#665), AcceleratedKernels 0.5.1, Julia 1.12.7 and 1.13.
- Lingua principale
- Julia
- Stelle
- 217
- Fork
- 37
- Merge medio
- 1g 7h
- PR unite (30g)
- 33
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di JuliaGPU/oneAPI.jl
-
IGC heap corruption compiling findmax's reduction kernel on Julia 1.12 with --check-bounds=yesAperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 Mezza giornata Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
JuliaGPU/oneAPI.jl#663 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
Track outstanding GPU work per allocation for host-accessible arraysForse già presa @maleadt l’ha presa 2 giorni fa. Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 45/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
JuliaGPU/oneAPI.jl#607 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di JuliaGPU/oneAPI.jl
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
oscar-system/GAP.jl#1455 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
JuliaAI/MLJTransforms.jl#85 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
SciML/OrdinaryDiffEq.jl#4875 ·
I maintainer di solito rispondono entro 4 giorni
-
documentation
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
SciML/NonlinearSolve.jl#1372 ·
I maintainer di solito rispondono entro 1 giorno