Lazy evaluation chain

Offen
#1,101 2 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Anfängerfreundlichkeit
20/100
Issue-Typ
Feature
Klarheit
Muss geklärt werden
Aktivitätsstatus
Veraltet
Tech-Stack
rust
Bereich
data, performance

Rechercherichtung

Start with the linked pull-request discussion, then inspect the existing ArrayBase methods that could move into ArrayOps. Review the proposed ArrayBase.chain(), LazyChain, and LazyChain.eval() API along with the ownership and copy-versus-in-place decision points. Done requires those design questions to be resolved and the lazy operation chain specified.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Motivation

Following from discussion starting here: https://github.com/rust-ndarray/ndarray/pull/1042#issuecomment-957134294

With contemporary systems, moving the data from memory into caches and registers often dominates the runtime of numerical algorithms depending on how many arithmetic operations they perform relative to each memory access. Fusing operations from multiple passes into a single pass increases this ratio and thereby the likelihood of efficient CPU utilisation. [1]

In theory this problem is solved using loops and/or mapv, but this doesn't provide a very user-friendly interface. Users who want to work at a high level still want to be able to use arr.pow(), arr.log() etc, but also retain the speed of this per-element processing (rather than applying each operation to each element and then the next operation to each element).

Proposed Changes

  • We move a subset of the ArrayBase methods into an ArrayOps trait. Note: this probably can't be all methods because it can only work for methods that return an array, so axes, as_slice, get etc don't necessarily make sense
  • This trait gets implemented by ArrayBase, but also a new struct called LazyChain (or something idk)
  • LazyChain gets created by ArrayBase.chain()
  • LazyChain will own (?) an ArrayBase, as well as a list of operations that will be sequentially applied to it
  • Then, LazyChain.eval() runs these operations sequentially on each element of the owned array, and then returns the modified array

Decision Points

  • Names for structs and traits
  • Should LazyChain return a copy or a modified in-place array?
  • Should LazyChain own the array or just borrow it? Should we have two different types do each?
Vorherrschende Sprache
Rust
Sterne
4.3k
Forks
391
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus rust-ndarray/ndarray

Alle Issues in rust-ndarray/ndarray

Ähnliche Issues

Weitere Issues zu Rust

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.