Optimierung einer Klasse von Elektronischen Strukturberechnungen durch Abwgen
Optimierung einer Klasse von Elektronischen Strukturberechnungen durch Abwägen von Speicherbedarf und Rechenzeit Gerald Baumgartner, Ohio State Daniel Cociorva, Ohio State Chi-Chung Lam, Ohio State P. Sadayappan, Ohio State J. Ramanujam, Louisiana State Marcel Nooijen, Princeton David E. Bernholdt, ORNL Robert Harrison, PNNL
Realistisches Quantenchemie Beispiel hbar[a, b, i, j] == sum[f[b, c]*t[i, j, a, c], {c}] -sum[f[k, c]*t[k, b]*t[i, j, a, c], {k, c}] +sum[f[a, c]*t[i, j, c, b], {c}] -sum[f[k, c]*t[k, a]*t[i, j, c, b], {k, c}] sum[f[k, j]*t[i, k, a, b], {k}] -sum[f[k, c]*t[j, c]*t[i, k, a, b], {k, c}] -sum[f[k, i]*t[j, k, b, a], {k}] -sum[f[k, c]*t[i, c]*t[j, k, b, a], {k, c}] +sum[t[i, c]*t[j, d]*v[a, b, c, d], {c, d}] +sum[t[i, j, c, d]*v[a, b, c, d], {c, d}] +sum[t[j, c]*v[a, b, i, c], {c}] -sum[t[k, b]*v[a, k, i, j], {k}] +sum[t[i, c]*v[b, a, j, c], {c}] -sum[t[k, a]*v[b, k, j, i], {k}] -sum[t[k, d]*t[i, j, c, b]*v[k, a, c, d], {k, c, d}] -sum[t[i, c]*t[j, k, b, d]*v[k, a, c, d], {k, c, d}] sum[t[j, c]*t[k, b]*v[k, a, c, i], {k, c}] +2*sum[t[j, k, b, c]*v[k, a, c, i], {k, c}] -sum[t[j, k, c, b]*v[k, a, c, i], {k, c}] sum[t[i, c]*t[j, d]*t[k, b]*v[k, a, d, c], {k, c, d}] +2*sum[t[k, d]*t[i, j, c, b]*v[k, a, d, c], {k, c, d}] -sum[t[k, b]*t[i, j, c, d]*v[k, a, d, c], {k, c, d}] sum[t[j, d]*t[i, k, c, b]*v[k, a, d, c], {k, c, d}] +2*sum[t[i, c]*t[j, k, b, d]*v[k, a, d, c], {k, c, d}] -sum[t[i, c]*t[j, k, d, b]*v[k, a, d, c], {k, c, d}] sum[t[j, k, b, c]*v[k, a, i, c], {k, c}] -sum[t[i, c]*t[k, b]*v[k, a, j, c], {k, c}] -sum[t[i, k, c, b]*v[k, a, j, c], {k, c}] -sum[t[i, c]*t[j, d]*t[k, a]*v[k, b, c, d], {k, c, d}] -sum[t[k, d]*t[i, j, a, c]*v[k, b, c, d], {k, c, d}] -sum[t[k, a]*t[i, j, c, d]*v[k, b, c, d], {k, c, d}] +2*sum[t[j, d]*t[i, k, a, c]*v[k, b, c, d], {k, c, d}] sum[t[j, d]*t[i, k, c, a]*v[k, b, c, d], {k, c, d}] -sum[t[i, c]*t[j, k, d, a]*v[k, b, c, d], {k, c, d}] -sum[t[i, c]*t[k, a]*v[k, b, c, j], {k, c}] +2*sum[t[i, k, a, c]*v[k, b, c, j], {k, c}] -sum[t[i, k, c, a]*v[k, b, c, j], {k, c}] +2*sum[t[k, d]*t[i, j, a, c]*v[k, b, d, c], {k, c, d}] sum[t[j, d]*t[i, k, a, c]*v[k, b, d, c], {k, c, d}] -sum[t[j, c]*t[k, a]*v[k, b, i, c], {k, c}] -sum[t[j, k, c, a]*v[k, b, i, c], {k, c}] -sum[t[i, k, a, c]*v[k, b, j, c], {k, c}] +sum[t[i, c]*t[j, d]*t[k, a]*t[l, b]*v[k, l, c, d], {k, l, c, d}] -2*sum[t[k, b]*t[l, d]*t[i, j, a, c]*v[k, l, c, d], {k, l, c, d}] 2*sum[t[k, a]*t[l, d]*t[i, j, c, b]*v[k, l, c, d], {k, l, c, d}] +sum[t[k, a]*t[l, b]*t[i, j, c, d]*v[k, l, c, d], {k, l, c, d}] 2*sum[t[j, c]*t[l, d]*t[i, k, a, b]*v[k, l, c, d], {k, l, c, d}] -2*sum[t[j, d]*t[l, b]*t[i, k, a, c]*v[k, l, c, d], {k, l, c, d}] +sum[t[j, d]*t[l, b]*t[i, k, c, a]*v[k, l, c, d], {k, l, c, d}] -2*sum[t[i, c]*t[l, d]*t[j, k, b, a]*v[k, l, c, d], {k, l, c, d}] +sum[t[i, c]*t[l, a]*t[j, k, b, d]*v[k, l, c, d], {k, l, c, d}] +sum[t[i, c]*t[l, b]*t[j, k, d, a]*v[k, l, c, d], {k, l, c, d}] +sum[t[i, k, c, d]*t[j, l, b, a]*v[k, l, c, d], {k, l, c, d}] +4*sum[t[i, k, a, c]*t[j, l, b, d]*v[k, l, c, d], {k, l, c, d}] -2*sum[t[i, k, c, a]*t[j, l, b, d]*v[k, l, c, d], {k, l, c, d}] -2*sum[t[i, k, a, b]*t[j, l, c, d]*v[k, l, c, d], {k, l, c, d}] -2*sum[t[i, k, a, c]*t[j, l, d, b]*v[k, l, c, d], {k, l, c, d}] +sum[t[i, k, c, a]*t[j, l, d, b]*v[k, l, c, d], {k, l, c, d}] +sum[t[i, c]*t[j, d]*t[k, l, a, b]*v[k, l, c, d], {k, l, c, d}] +sum[t[i, j, c, d]*t[k, l, a, b]*v[k, l, c, d], {k, l, c, d}] -2*sum[t[i, j, c, b]*t[k, l, a, d]*v[k, l, c, d], {k, l, c, d}] -2*sum[t[i, j, a, c]*t[k, l, b, d]*v[k, l, c, d], {k, l, c, d}] +sum[t[j, c]*t[k, b]*t[l, a]*v[k, l, c, i], {k, l, c}] +sum[t[l, c]*t[j, k, b, a]*v[k, l, c, i], {k, l, c}] -2*sum[t[l, a]*t[j, k, b, c]*v[k, l, c, i], {k, l, c}] +sum[t[l, a]*t[j, k, c, b]*v[k, l, c, i], {k, l, c}] -2*sum[t[k, c]*t[j, l, b, a]*v[k, l, c, i], {k, l, c}] +sum[t[k, a]*t[j, l, b, c]*v[k, l, c, i], {k, l, c}] +sum[t[k, b]*t[j, l, c, a]*v[k, l, c, i], {k, l, c}] +sum[t[j, c]*t[l, k, a, b]*v[k, l, c, i], {k, l, c}] +sum[t[i, c]*t[k, a]*t[l, b]*v[k, l, c, j], {k, l, c}] +sum[t[l, c]*t[i, k, a, b]*v[k, l, c, j], {k, l, c}] -2*sum[t[l, b]*t[i, k, a, c]*v[k, l, c, j], {k, l, c}] +sum[t[l, b]*t[i, k, c, a]*v[k, l, c, j], {k, l, c}] +sum[t[i, c]*t[k, l, a, b]*v[k, l, c, j], {k, l, c}] +sum[t[j, c]*t[l, d]*t[i, k, a, b]*v[k, l, d, c], {k, l, c, d}] +sum[t[j, d]*t[l, b]*t[i, k, a, c]*v[k, l, d, c], {k, l, c, d}] +sum[t[j, d]*t[l, a]*t[i, k, c, b]*v[k, l, d, c], {k, l, c, d}] -2*sum[t[i, k, c, d]*t[j, l, b, a]*v[k, l, d, c], {k, l, c, d}] -2*sum[t[i, k, a, c]*t[j, l, b, d]*v[k, l, d, c], {k, l, c, d}] +sum[t[i, k, c, a]*t[j, l, b, d]*v[k, l, d, c], {k, l, c, d}] +sum[t[i, k, a, b]*t[j, l, c, d]*v[k, l, d, c], {k, l, c, d}] +sum[t[i, k, c, b]*t[j, l, d, a]*v[k, l, d, c], {k, l, c, d}] +sum[t[i, k, a, c]*t[j, l, d, b]*v[k, l, d, c], {k, l, c, d}] +sum[t[k, a]*t[l, b]*v[k, l, i, j], {k, l}] +sum[t[k, l, a, b]*v[k, l, i, j], {k, l}] +sum[t[k, b]*t[l, d]*t[i, j, a, c]*v[l, k, c, d], {k, l, c, d}] +sum[t[k, a]*t[l, d]*t[i, j, c, b]*v[l, k, c, d], {k, l, c, d}] +sum[t[i, c]*t[l, d]*t[j, k, b, a]*v[l, k, c, d], {k, l, c, d}] -2*sum[t[i, c]*t[l, a]*t[j, k, b, d]*v[l, k, c, d], {k, l, c, d}] +sum[t[i, c]*t[l, a]*t[j, k, d, b]*v[l, k, c, d], {k, l, c, d}] +sum[t[i, j, c, b]*t[k, l, a, d]*v[l, k, c, d], {k, l, c, d}] +sum[t[i, j, a, c]*t[k, l, b, d]*v[l, k, c, d], {k, l, c, d}] 2*sum[t[l, c]*t[i, k, a, b]*v[l, k, c, j], {k, l, c}] +sum[t[l, b]*t[i, k, a, c]*v[l, k, c, j], {k, l, c}] +sum[t[l, a]*t[i, k, c, b]*v[l, k, c, j], {k, l, c}] +v[a, b, i, j]
Problem: Tensorkontraktionen • Formeln der Form • Dutzende Arrays und Arrayindices, 100 e von Termen • Indexbereiche von 10 bis 3000 • Und das ist noch einfaches Modell
Anwendungsgebiet • Quantenchemie, Physik kondensierter Materie • Beispiel: studieren chemischer Eigenschaften • Typische Programmstruktur Quantenchemie Code; while (! fertig) { Tensorkontraktionen; Quantenchemie Code; } • Großteil der Rechenzeit in Tensorkontraktionen
Überblick • Einleitung • Optimierungsprobleme • Algorithmen • Demo und weiterführende Arbeit
Operationsminimierung • Braucht 4 * N 10 Operationen für Indexe a – l im Bereich N • Assoziative, kommutative, distributive Gesetze verwendbar • Optimale Formelsequenz braucht nur 6 * N 6 Operationen
Schleifenfusionierung zur Speicherreduktion S=0 T 1 = 0; T 2 = 0; S = 0 for b, c, d, e, f, l T 1 bcdf += Bbefl Dcdel for b, c, d, f, j, k T 2 bcjk += T 1 bcdf Cdfjk for a, b, c, i, j, k Sabij += T 2 bcjk Aacik for b, c T 1 f = 0; T 2 f = 0 for d, f for e, l T 1 f += Bbefl Dcdel for j, k T 2 fjk += T 1 f Cdfjk for a, i, j, k Sabij += T 2 fjk Aacik Formelsequenz Nicht-fusionierter Code Fusionierter Code
Illustration von Space-Time Trade-Offs for a, e, c, f for i, j Xaecf += Tijae Tijcf for c, e, b, k T 1 cebk = f 1(c, e, b, k) for a, f, b, k T 2 afbk = f 2(a, f, b, k) Array Speicher Zeit X V 4 O 2 T 1 V 3 O Cf 1 V 3 O T 2 V 3 O Cf 2 V 3 O Y V 4 V 5 O E 1 V 4 for c, e, a, f for b, k Yceaf += T 1 cebk T 2 afbk for c, e, a, f E += Xaecf Yceaf a. . f: range V = 1000. . 3000 i. . k: range O = 30. . 100
Speicherminimale Form for a, f, b, k T 2 afbk = f 2(a, f, b, k) for c, e for b, k T 1 bk = f 1(c, e, b, k) for a, f for i, j Array Speicher Zeit X 1 V 4 O 2 T 1 VO Cf 1 V 3 O T 2 V 3 O Cf 2 V 3 O Y 1 V 5 O E 1 V 4 X += Tijae Tijcf for b, k Y += T 1 bk T 2 afbk E += X Y a. . f: range V = 3000 i. . k: range O = 100
Redundante Rechnungen für volle Fusion for a, e, c, f for i, j X += Tijae Tijcf for b, k T 1 = f 1(c, e, b, k) T 2 = f 2(a, f, b, k) Y += T 1 T 2 E += X Y Array Speicher Zeit X 1 V 4 O 2 T 1 1 Cf 1 V 5 O T 2 1 Cf 2 V 5 O Y 1 V 5 O E 1 V 4
Kacheln zur Reduktion von Neuberechnungen for at, et, ct, ft for a, e, c, f for i, j Xaecf += Tijae Tijcf for b, k for c, e T 1 ce = f 1(c, e, b, k) for a, f T 2 af = f 2(a, f, b, k) for c, e, a, f Yceaf += T 1 ce T 2 af for c, e, a, f E += Xaecf Yceaf Array Speicher Zeit X B 4 V 4 O 2 T 1 B 2 Cf 1(V/B)2 V 3 O T 2 B 2 Cf 2(V/B)2 V 3 O Y B 4 V 5 O E 1 V 4
Kacheln zur Minimierung der Zugriffszeit FOR ii = 1, Ni, Ti FOR jj = 1, Nj, Tj FOR kk = 1, Nk, Tk FOR i = ii, ii + Ti - 1 FOR j = jj, jj + Tj - 1 FOR k = kk, kk + Tk - 1 C(i, k) = C(i, k) + A(i, j) * B(j, k) END FOR k, j, i, kk, jj, ii Wähle Ti, Tj, und Tk so daß Ti * Tj + Ti * Tk + Tj * Tk < Cache Größe Anzahl der Cache Misses: • A(i, j): Ni * Nj • B(j, k): Nj * Nk * Ni/Ti • C(i, k): Ni * Nk * Nj/Tj
Überblick • Einleitung • Optimierungsprobleme • Algorithmen • Demo und weiterführende Arbeit
Tensor Contraction Engine Tensorkontraktionsausdrücke Operationsminimierung Geschachtelte Schleifen (Bäume) Speicherminimierung (Speicherbedarf > Speicherplatz) (Speicherbedarf ≤ Speicherplatz) Space-Time Trade-Offs Unregelmäßig geschachtelte Schleifen Kommunikationsminimierung Parallele Schleifen Datenzugriffsoptimierung Gekachelte, parallele Fortran Schleifen
Anwendungsspezifische Sprache mlimit = 144000010; range V = 300; range O = 70; range U = 40; index a, b, c, d : V; index e, f : O; index i, j, k, l : U; procedure P (in T[V, V, U, U], in S[V, U, O, U], in N[V, V, O, U], in D[V, O, O, U], out X[V, V, O, O]) = begin X[a, b, i, j] == sum[T[a, c, i, k] * S[d, j, f, k] * N[c, d, e, l] * D[b, e, f, l], {c, d, e, f, k, l}]; end
Operationsminimierung • Für individuellen Term (ohne binäre Addition): – Bottom-up dynamischer Programmieralgorithmus – NP-vollständig, aber sehr effizientes Pruning • Für beliebige Tensorkontraktionsausdrücke – Aufzählung aller Formeln mit distributiven/assoziativen Gesetzen – Verwendung von Suchalgorithmus mit Pruning für Terme – Verwendung der chemischen Struktur für Pruning
Speicherminimierung • Aufzählen aller möglichen Schleifenstrukturen • Dynamischer Programmieralgorithmus • Für jeden Knoten im Ausdrucksbaum – – Berechne Menge der Lösungen mit (Fusion, Speicherbedarf) Z. B. , (<ij, k, l>, 42) Streiche Lösungen mit eingeschränkterer Fusion, höheren Kosten Nur eine Lösungen für die Wurzel
Der Fusionsgraph ∑ j * A(i, j) i j j k B(j, k)
Explizite Fusionierte Schleifen i: range 10 j: range 10 k: range 100 ∑ j * A(i, j) i j j k B(j, k)
Space-Time Trade-Off Algorithmus • Für e 1(i, j, k) * e 2(i, j): mögliche Neuberechnung von e 2 in k. Schleife • Für jeden Knoten im Baum in bottom-up Algorithmus – Berechne Lösungsmenge { (Fusion, Speicher, Zeit), . . . } – Streiche suboptimale Lösungen • Für alle Lösungen für Wurzel des Ausdrucksbaumes – Teile Neuberechnungsschleifen in Kachel-/Intrakachelschleifen – Bringe Intrakachelschleifen innerhalb von Kachelchleifen – Suche nach Kachelgrößen zur Minimierung von Neuberechnungen
Einführung von Neuberechnungsschleifen i: range 10 j: range 10 k: range 100 ∑ * A(i, j) i j j { (<i j, k>, 3, 9000), . . . } i j k B(j, k)
Kacheln von Neuberechnungsschleifen i: range 10 j: range 10 k: range 100 ∑ j * A(it, i, j) it i j it j k B(j, k)
Kommunikationsminimierung • Prozessoren als multidimensionales Prozessornetz • Verteilung von Arraydimensionen über Prozessordimensionen – Beispiel: Verteilung von B(a, b, i, j): <a, i, *, 1> • Mögliche Umverteilung von Arrays vor Operation • Kommunikation: Übertragunszeit + Startzeit • Für jeden Knoten im Ausducksbaum – Berechne (Fusion, Verteilung, Speicher, Komm. -Kosten) Lösungen – Verwende Lösung mit geringster Kommunikationszeit die noch im Speicher Platz hat • Kommunikationskostenmodell ist empirisch erarbeitet
Datenzugriffsoptimierung • Problem: Schleifenfusion und Datenzugriff wiedersprüchlich • • Lösung: beginne mit fusionierter Schleifenstruktur Expandiere Skalare und Vektoren auf Kachelgröße Trenne Schleifen in Kachelschleifen und Intrakachelschleifen Bringe alle Intrakachelschleifen innerhalb der Kachelschleifen • In bottom-up Algorithmus über Syntaxbaum zähle Cache Misses • Iteratiere über Kachelgrößen um optimale Lösung zu finden
Überblick • Einleitung • Optimierungsprobleme • Algorithmen • Demo und weiterführende Arbeit
Zusammenfassung und Aktueller Stand • • Gut strukturiertes Anwendungsgebiet Suchalgorithmen zur Optimierung Empirisch erarbeitete Kostenmodelle Compilerentwicklung in Java • Zukünftige Erweiterungen – – Heuristiken für Operationsminimierung Schleifenfusion mit dynamischer Speicherallokierung Dünn besetzten Arrays, Symmetrie, azyklische Graphen Anwendungsspezifische Optimierungen
- Slides: 26