BLAS-1 methods pass reversed views to oneMKL with a negative increment
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 74/100
Direzione di ricerca
Start in lib/mkl/linalg.jl and lib/mkl/wrappers_blas.jl; compare the BLAS-1 methods and pointer/increment handling with LinearAlgebra's vec_pointer_stride behavior described in the issue. Check how non-contiguous multidimensional arrays reach these wrappers and where they can fall back to GPUArrays implementations. Done means reversed views and non-contiguous arrays produce correct results without writing outside the view; use the examples in the issue to verify.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
The BLAS-1 methods in lib/mkl/linalg.jl (norm, dot, BLAS.asum, axpy!, axpby!, rmul!, rotate!, reflect!) forward any oneStridedArray to the wrappers in lib/mkl/wrappers_blas.jl, which pass pointer(x) with incx = stride(x, 1). With a reversed view, that increment is negative and the results are silently wrong:
using oneAPI, LinearAlgebra
x = oneArray(Float32[3, 4]); r = view(x, 2:-1:1); y = oneArray(Float32[1, 2])
norm(r) # 4.0, expected 5.0
dot(r, y) # 8.0, expected 10.0
LinearAlgebra.BLAS.asum(r) # 4.0, expected 7.0
axpy!(1f0, r, copy(y)) # [1, 6], expected [5, 5]
rmul!(r, 2f0); x # [3, 8], expected [6, 8]
BLAS routines that accept a negative increment walk the vector backwards from its lowest address, while the pointer of a reversed view points at its first logical element, so they read and write the wrong memory.
The methods also accept non-contiguous arrays with more than one dimension, and the wrappers then treat them as length(x) elements with stride stride(x, 1). That gives wrong results and writes outside the view:
M = rand(Float32, 3, 2); dM = oneArray(M)
norm(view(dM, 1:2, :)) ≈ norm(M[1:2, :]) # false
rmul!(view(dM, 1:2, :), 2f0) # scales M[3, 1] instead of M[2, 2]
LinearAlgebra handles negative strides in its BLAS wrappers: vec_pointer_stride passes the pointer to the lowest address together with the signed increment, and nrm2, asum and scal use abs(stride(x, 1)), since the order doesn't matter for them. The wrappers should only take strided vectors or dense arrays, with other arrays falling back to the GPUArrays implementations. The storage-level mul! has a similar problem for gemv and friends, which is #700.
Same issue in CUDA.jl: JuliaGPU/CUDA.jl#3410.
Reproduced with oneAPI.jl 2.9.2 on an Iris Xe, Julia 1.12.7. The BLAS-1 methods and wrappers are unchanged on main.
- Lingua principale
- Julia
- Stelle
- 217
- Fork
- 37
- Merge medio
- 1g 7h
- PR unite (30g)
- 45
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
-
libraries upstream
Difficoltà 4/5 1-2 giorni Idoneità per principianti 22/100
JuliaGPU/oneAPI.jl#703 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 62/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
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
JuliaGPU/oneAPI.jl#538 · 2 commenti ·
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 83/100
JuliaGenAI/HuggingFaceDatasets.jl#96 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
JuliaData/DBFTables.jl#50 ·
-
_fit_phylo_binomial_xlv: default start calls undefined logit (UndefVarError without beta_init)Apertacode-review
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
JuliaNLSolvers/Optim.jl#1296 ·