`@fastmath` reductions are 2–5× slower: no `neutral_element` for `Base.FastMath.max_fast` and co.
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 86/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Ambito
- performance
Direzione di ricerca
Iniziate da reduce/utilities.jl, dove le riduzioni selezionano il fallback _Lane, e individuate il punto di estensione di GPUArraysCore per neutral_element. Aggiunete test per le riduzioni fast-math interessate e verificate che le riduzioni accelerate corrispondano in prestazioni a quelle non-fast-math, preservando la correttezza.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
AI agent:
@fastmath reduce(max, x; dims, init) reduces with Base.FastMath.max_fast, which has no GPUArraysCore.neutral_element method. AcceleratedKernels then takes its _Lane fallback (Base.promote_op(neutral_element, …) === Union{} in reduce/utilities.jl), even though init is given. That fallback is 2–5× slower than max. With GPUArrays 11 the two run at the same speed. NNlib's softmax uses @fastmath max reductions (FluxML/NNlib.jl#828 works around it).
using CUDA, BFloat16s, GPUArrays
const FLUSH = CUDA.zeros(UInt8, 256 * 2^20)
bench(f; n=20) = (f(); minimum(1e6 * (fill!(FLUSH, 0x00); CUDA.@elapsed f()) for _ in 1:n)) # µs
x = CuArray(BFloat16.(randn(Float32, 1024, 1024, 96)))
bench(() -> reduce(max, x; dims=1, init=-Inf32))
bench(() -> @fastmath reduce(max, x; dims=1, init=-Inf32))
# defining the neutral element closes the gap
GPUArrays.GPUArraysCore.neutral_element(::typeof(Base.FastMath.max_fast), T) = typemin(T)
µs, max / max_fast / max_fast with the method above:
max |
max_fast |
max_fast + neutral_element |
|
|---|---|---|---|
| Float32 1024 × 1024 × 96, dims=1 | 283 | 612 | 281 |
| Float32 768 × 8192, dims=2 | 24.5 | 51.2 | 24.6 |
| BFloat16 1024 × 1024 × 96, dims=1 | 145 | 610 | 145 |
| BFloat16 50304 × 8192, dims=1 | 690 | 3468 | 688 |
Adding neutral_element methods for max_fast and min_fast (and add_fast/mul_fast, which have none either) to GPUArraysCore would fix it.
GPUArrays 12.1.1, AcceleratedKernels 0.5.8, CUDA.jl main (a9e28c0), Julia 1.13.2, RTX 5090.
- Lingua principale
- Julia
- Stelle
- 455
- Fork
- 106
- Merge medio
- 2g 18h
- PR unite (30g)
- 20
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/GPUArrays.jl
-
arrays
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
JuliaGPU/GPUArrays.jl#697 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
`reverse(::JLArray)` errors with GPUArrays 12.1.1 and JLArrays 0.4.2 (JLArrays release missing)Apertainstallation regression
Difficoltà 2/5 1-3 ore Idoneità per principianti 57/100
JuliaGPU/GPUArrays.jl#817 ·
I maintainer di solito rispondono entro 1 giorno
-
installation latency regression upstream
Difficoltà 5/5 Più di una settimana Idoneità per principianti 15/100
JuliaGPU/GPUArrays.jl#813 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
arrays latency regression
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
JuliaGPU/GPUArrays.jl#807 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
arrays
Difficoltà 4/5 3-5 giorni Idoneità per principianti 68/100
JuliaGPU/GPUArrays.jl#792 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di JuliaGPU/GPUArrays.jl
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 73/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 76/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
jump-dev/MathOptInterface.jl#3113 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 83/100
JuliaMath/Polynomials.jl#647 ·
-
reactant ☣
Difficoltà 2/5 1-3 ore Idoneità per principianti 79/100
NumericalEarth/Breeze.jl#1110 ·
I maintainer di solito rispondono entro 1 giorno