Unnecessary allocation when not unpacking?

Aperta
#161 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
35/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
julia
Ambito
performance

Direzione di ricerca

Inizia riproducendo gli esempi f1! e f2! di BenchmarkTools riportati nell’issue e confronta le loro allocazioni per u.x .= 0.0 con quelle di una x locale. Analizza il comportamento dell’accesso alle proprietà e del broadcasting di ComponentArrays coinvolto; il lavoro è concluso quando si determina se la differenza nelle allocazioni è prevista oppure la si corregge con un benchmark o un test di regressione.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

If I don't unpack x = u.x a component vector before updating it, say with u.x .+= 1 instead of x = u.x; x .+= 1 , I get some extra allocations. The strange thing is that both x and u.x seem to be identical.

Is that intended/expected (and if so, mind me ask why?) or is it a bug?

julia> using ComponentArrays

julia> using BenchmarkTools

julia> u = ComponentVector(x = [0.9, 0.1])
ComponentVector{Float64}(x = [0.9, 0.1])

julia> function f1!(u)
           u.x .= 0.0
           nothing
       end
f1! (generic function with 1 method)

julia> function f2!(u)
           x = u.x
           x .= 0.0
           nothing
       end
f2! (generic function with 1 method)

julia> @btime f1!($(copy(u)));
  259.803 ns (2 allocations: 64 bytes)

julia> @btime f2!($(copy(u)));
  6.166 ns (0 allocations: 0 bytes)

julia> x = u.x
2-element view(::Vector{Float64}, 1:2) with eltype Float64:
 0.9
 0.1

julia> x === u.x
true

Here is the system info:

(ca) pkg> st
      Status `~/temp/ca/Project.toml`
  [6e4b80f9] BenchmarkTools v1.3.1
  [b0b7db55] ComponentArrays v0.12.5

julia> versioninfo()
Julia Version 1.7.2
Commit bf53498635 (2022-02-06 15:21 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin19.5.0)
  CPU: Apple M1 Pro
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-12.0.1 (ORCJIT, westmere)
Environment:
  JULIA_NUM_THREADS = 8
Lingua principale
Julia
Stelle
378
Fork
43
Merge medio
6h 49m
PR unite (30g)
3

Preparare l'ambiente

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 SciML/ComponentArrays.jl

Tutte le issue di SciML/ComponentArrays.jl

Issue simili

Altre issue su Julia

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.