JuliaSIMD / JuliaSIMD/LoopVectorization.jl

Handle loop carried dependencies that are apparent from constant offsets

Offen
#122 4 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand ΓΌbernommen.

Vorherrschende Sprache
Julia
Sterne
789
Forks
73
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

```julia
using LoopVectorization
function grad!(π›₯rec, π›₯β„›, rec)
for i in 2:size(π›₯rec, 1)-1
for j in 2:size(π›₯rec, 2)-1
ℰ𝓍1 = conj(π›₯β„›[1])
ℰ𝓍2 = rec[i, j + 1] + rec[i, j - 1]
ℰ𝓍3 = rec[i + 1, j] + ℰ𝓍2
ℰ𝓍4 = rec[i - 1, j] + ℰ𝓍3
ℰ𝓍5 = 4 * rec[i, j]
ℰ𝓍6 = ℰ𝓍4 - ℰ𝓍5
ℰ𝓍7 = 2ℰ𝓍6
ℰ𝓍8 = ℰ𝓍1 * ℰ𝓍7
ℰ𝓍9 = conj(ℰ𝓍8)
ℰ𝓍10 = rec[i - 1, j] + ℰ𝓍3
ℰ𝓍11 = ℰ𝓍10 - ℰ𝓍5
ℰ𝓍12 = 2ℰ𝓍11
ℰ𝓍13 = ℰ𝓍1 * ℰ𝓍12
ℰ𝓍14 = conj(ℰ𝓍13)
ℰ𝓍15 = rec[i - 1, j] + ℰ𝓍3
ℰ𝓍16 = ℰ𝓍15 - ℰ𝓍5
ℰ𝓍17 = 2ℰ𝓍16
ℰ𝓍18 = ℰ𝓍1 * ℰ𝓍17
ℰ𝓍19 = conj(ℰ𝓍18)
ℰ𝓍20 = rec[i - 1, j] + ℰ𝓍3
ℰ𝓍21 = ℰ𝓍20 - ℰ𝓍5
ℰ𝓍22 = 2ℰ𝓍21
ℰ𝓍23 = ℰ𝓍1 * ℰ𝓍22
ℰ𝓍24 = conj(ℰ𝓍23)
ℰ𝓍25 = rec[i - 1, j] + ℰ𝓍3
ℰ𝓍26 = ℰ𝓍25 - ℰ𝓍5
ℰ𝓍27 = 2ℰ𝓍26
ℰ𝓍28 = -4ℰ𝓍27
ℰ𝓍29 = ℰ𝓍1 * ℰ𝓍28
ℰ𝓍30 = conj(ℰ𝓍29)
π›₯rec[i - 1, j] = π›₯rec[i - 1, j] + ℰ𝓍9
π›₯rec[i + 1, j] = π›₯rec[i + 1, j] + ℰ𝓍14
π›₯rec[i, j + 1] = π›₯rec[i, j + 1] + ℰ𝓍19
π›₯rec[i, j - 1] = π›₯rec[i, j - 1] + ℰ𝓍24
π›₯rec[i, j] = π›₯rec[i, j] + ℰ𝓍30
end
end
end
function gradavx!(π›₯rec, π›₯β„›, rec)
@avx for i in 2:size(π›₯rec, 1)-1
for j in 2:size(π›₯rec, 2)-1
ℰ𝓍1 = conj(π›₯β„›[1])
ℰ𝓍2 = rec[i, j + 1] + rec[i, j - 1]
ℰ𝓍3 = rec[i + 1, j] + ℰ𝓍2
ℰ𝓍4 = rec[i - 1, j] + ℰ𝓍3
ℰ𝓍5 = 4 * rec[i, j]
ℰ𝓍6 = ℰ𝓍4 - ℰ𝓍5
ℰ𝓍7 = 2ℰ𝓍6
ℰ𝓍8 = ℰ𝓍1 * ℰ𝓍7
ℰ𝓍9 = conj(ℰ𝓍8)
ℰ𝓍10 = rec[i - 1, j] + ℰ𝓍3
ℰ𝓍11 = ℰ𝓍10 - ℰ𝓍5
ℰ𝓍12 = 2ℰ𝓍11
ℰ𝓍13 = ℰ𝓍1 * ℰ𝓍12
ℰ𝓍14 = conj(ℰ𝓍13)
ℰ𝓍15 = rec[i - 1, j] + ℰ𝓍3
ℰ𝓍16 = ℰ𝓍15 - ℰ𝓍5
ℰ𝓍17 = 2ℰ𝓍16
ℰ𝓍18 = ℰ𝓍1 * ℰ𝓍17
ℰ𝓍19 = conj(ℰ𝓍18)
ℰ𝓍20 = rec[i - 1, j] + ℰ𝓍3
ℰ𝓍21 = ℰ𝓍20 - ℰ𝓍5
ℰ𝓍22 = 2ℰ𝓍21
ℰ𝓍23 = ℰ𝓍1 * ℰ𝓍22
ℰ𝓍24 = conj(ℰ𝓍23)
ℰ𝓍25 = rec[i - 1, j] + ℰ𝓍3
ℰ𝓍26 = ℰ𝓍25 - ℰ𝓍5
ℰ𝓍27 = 2ℰ𝓍26
ℰ𝓍28 = -4ℰ𝓍27
ℰ𝓍29 = ℰ𝓍1 * ℰ𝓍28
ℰ𝓍30 = conj(ℰ𝓍29)
π›₯rec[i - 1, j] = π›₯rec[i - 1, j] + ℰ𝓍9
π›₯rec[i + 1, j] = π›₯rec[i + 1, j] + ℰ𝓍14
π›₯rec[i, j + 1] = π›₯rec[i, j + 1] + ℰ𝓍19
π›₯rec[i, j - 1] = π›₯rec[i, j - 1] + ℰ𝓍24
π›₯rec[i, j] = π›₯rec[i, j] + ℰ𝓍30
end
end
end
x = rand(10,10);
dx1 = fill!(similar(x), 0); dx2 = fill!(similar(x), 0);
del = ones(1);
grad!(dx1, del, x); gradavx!(dx2, del, x)
dx1 .- dx2
```

Beitragsleitfaden

FΓΌr dieses Repository ist kein Beitragsleitfaden indexiert

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es ΓΌbernimmst β€” das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Γ–ffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit dem grad! und gradavx! Reproducer im Issue und fΓΌhre ihn in Julia aus, wobei du dx1 und dx2 vergleichst. Untersuche, wie @avx Zugriffe mit konstantem Offset und schleifentragende Aktualisierungen behandelt; die Aufgabe ist abgeschlossen, wenn das vektorisierte Ergebnis fΓΌr diesen Fall mit dem nicht vektorisierten Ergebnis ΓΌbereinstimmt und eine angemessene Testabdeckung vorhanden ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
julia
Bereich
performance
Issue-Typ
Bug
Schwierigkeit
5/5
GeschΓ€tzter Aufwand
Über eine Woche
AktivitΓ€tsstatus
Veraltet
Klarheit
Grâßtenteils klar
AnfΓ€ngerfreundlichkeit
30/100

Neue Issues direkt in Ihr Postfach

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