Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

BLAS-1 methods pass reversed views to oneMKL with a negative increment

Aperta
#712 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

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
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
julia
Ambito
backend

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

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di JuliaGPU/oneAPI.jl

Tutte le issue di JuliaGPU/oneAPI.jl

Issue simili

Altre issue su Julia

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.