Termin 7: DATENSTRUKTUREN UND ALGORITHMEN 133 Modell-Annahmen Annahme: Für eine dünn besetzte Matrix der Dimensionen M x N gilt nnz = Ω(N, M). Annahme: Der schnelle Speicher ist nicht groß genug, um eine Datenstruktur vollständig zu halten. Frage: Wie viele Nichtnull-Einträge lassen sich pro GB RAM speichern? (Annahme: 16 Byte pro Eintrag) Antwort: 2 30 / 16 = 2 26 Annahme: Acht Einträge pro Zeile => N 2 23 Folgerung: L2 Cache kann einen entsprechend großen dicht besetzten Vektor nicht halten. 134
2.2: Wichtige Basisoperationen Matrixoperationen und ihre Entsprechungen bei Graphen: Sparse matrix indexing and assignment (SpRef/SpAsgn): Auswahl eines Teilgraphen Sparse matrix-dense vector multiplication (SpMV): Breitensuche Tiefensuche Sparse matrix addition, andere punktweise Ops (SpAdd): Vereinigung von Graphen Sparse matrix-sparse matrix multiplication (SpGEMM): BFS, DFS von mehreren Startknoten gleichzeitig, APSP 135 SpRef / SpAssgn Auswahl eines Teilgraphen SpRef: B = A(p, q) Speichern einer Teilmatrix von A in B A(p,q) SpAssgn: B(p, q) = A Zuweisung einer Matrix A an eine Teilmatrix von B A B Beispiele fürs Indizieren: Zeilenwahl: A(i, :) Spaltenwahl: A(:, i) A B(p,q) B 136
SpMV Breiten- und Tiefensuche y = Ax (oder auch y = x A) Vermutlich gängigste Operation, eingesetzt u. a. in: Gleichungssystemlösern Eigenlösern Weitere (Anwendungs-)Beispiele: PageRank BFS Bellman-Ford MST-Algorithmus von Jarnik und Prim A x y 137 SpAdd Vereinigung von Graphen C = A + B Addition hier Repräsentant für andere punktweisen Ops: MIN MAX AND OR B C A... Vereinigung von Graphen 138
SpGEMM APSP C = AB Anwendungen: Kontraktion PPC BFS von mehreren Startpunkten APSP A B C Addition von Skalarprodukten (inner products) Addition von dyadischen Produkten (outer products) Zeilenweise Spaltenweise Tafel! 139 2.3: Datenstrukturen für dünn besetzte Graphen und Matrizen Tripel (D)CSR / CSC Dynamische Graphen 140
Tripel-Format Jeder Nichtnull-Eintrag wird durch ein Tripel repräsentiert Zeilenindex Spaltenindex Wert des Eintrags Drei Arrays pro Matrix A: A.I A.J A.V Repräsentation in Strukturen meist besser als 3 separate Arrays (Cache-Performance, Programmierbarkeit) Speicherverbrauch pro Eintrag: 8 + 8 + 8 = 24 Bytes 141 (Un)Geordnete Tripel Ungeordnet: Keine irgendwie geartete Sortierung Zeilenordnung: Einträge sind gemäß Zeilenindex sortiert Einträge derselben Zeile erscheinen in beliebiger Reihenfolge Zeilendominante Reihenfolge: Einträge sind gemäß Zeilenindex sortiert Einträge in derselben Zeile gemäß Spaltenindex sortiert Möglich: Sortierungsreihenfolge tauschen (Zeile Spalte) In der Theorie (und ggf. bei Dynamik) gut: Hashing 142
Beispiel ungeordneter Tripel A.I A.J A.V A = 19 0 11 0 0 43 0 0 0 0 0 0 0 27 0 35 1 1 19 4 2 27 2 2 43 4 4 35 1 3 11 SpMV mit ungeordneten Tripeln: Siehe Tafel! I/O-Komplexität von SpMV: nnz(a)/l + 2 nnz(a) = O(nnz(A)) 143 Geordnete Tripel: Zeilenordnung Indizierung immer noch schwierig Schneller Zeilenzugriff ohne Index nicht möglich Binäre Suche zum Finden des Startpunkts Cache-Performance immer noch problematisch Frage: Warum? A.I A.J A.V 19 0 11 0 1 3 11 A = 0 43 0 0 1 1 19 0 0 0 0 2 2 43 0 27 0 35 4 2 27 4 4 35 144
Zeilendominante geordnete Tripel Zeilendominante Reihenfolge, Zugriff auf A(i, j): Finde mit binärer Suche ein Tripel (i, j, A(i, j )) derselben Zeile i Von diesem Tripel in beide Richtungen jeweils eine unbegrenzte binäre Suche starten; stoppen, wenn Zeile i verlassen wird Innerhalb dieser beiden Stoppgrenzen mit binärer Suche A(i, j) suchen A = 19 0 11 0 0 43 0 0 0 0 0 0 0 27 0 35 A.I A.J A.V 1 1 19 1 3 11 2 2 43 4 2 27 4 4 35 145 Beispiel [KG, S. 304] 146
Komplexität für Referenzierung RAM-Modell: Kosten für Referenzierung: log nnz(a) + log nnz(a(i, :)) EM-Modell: Unbegrenzte binäre Suche mglw. schlechter als lineare Scans Kosten für Suche in einem sortierten Array: min{log nnz(a(i, :)), scan(a(i, :))} Für Spaltenzugriff sowie SpAssgn ergibt sich durch Sortierung innerhalb der Zeilen keine Verbesserung 147 Zeilendominante Reihenfolge y = Ax Auf die Arrays in A sowie y wird überwiegend konsekutiv zugegriffen Auf x wird mit aufsteigendem Index zugegriffen: Verbesserung gegenüber Zeilenordnung Trotzdem: Jeder Zugriff kann ein Cache-Fehlzugriff sein I/O-optimale Algorithmen für SpMV unter Annahmen (Bender et al. 2007) SpAdd: Scannen und verschmelzen von sortierten Arrays: RAM: O(nnz(A) + nnz(b)) EM: O(scan(A) + scan(b)) SpGEMM: Fingersuche (Brodal et al. 2005) 148
Zwischenfazit Datenstrukturen und Algorithmen: Typische Matrixalgorithmen haben unterschiedliche Anforderungen Ungeordnete Tripel Zeilengeordnete Tripel Zeilendominante Tripel Fazit: Je mehr Struktur, desto stärker lässt sich der Cache nutzen 149 CSR / CSC Compressed sparse row/column Auch Adjazenzarrays genannt Wohl die populärsten Formate Abwandlung von Adjazenzlisten Frage: Was ist der Nachteil von Adjazenzlisten in der Praxis? CSR hat 3 Arrays (CSC ist symmetrisch): IR: Größe N+1, Index des Zeilenstarts in anderen Arrays JC: Größe nnz, Spaltenindex des Eintrags NUM: Größe nnz, Wert des Eintrags 154
Beispiel Einfügen ohne Anpassungen ineffizient, daher nur gut für statische Graphen A = 19 0 11 0 0 43 0 0 0 0 0 0 0 27 0 35 A.IR 1 3 4 4 6 A.JC 1 3 2 2 4 A.NUM 19 11 43 27 35 Achtung: Indizierung startet bei 1! 155 Grundoperationen mit CSR Zeilenindizierung in O(1) Iterieren über Zeile: RAM: O(nnz(A(i, :)) EM: O(scan(A(i, :)) Element (i, j) finden: RAM und EM: O(log nnz(a(i, :)) Aber: Sequentieller Zugriff kann bei Caches besser sein als binäre Suche, jedenfalls bei kleinem Knotengrad Spaltenweiser Zugriff ineffizient 156
CSR mit Diagonalverschiebung Für manche Algorithmen: Schneller Zugriff auf Diagonalelement wichtig Abwandlung 1: Diagonale in separatem Array Abwandlung 2: CSR wie bisher, aber erstes Element jeder Zeile ist immer Diagonale (sogar wenn 0) Weitere Varianten existieren... 157 SpMV mit CSR Übung an der Tafel Frage: Bei welcher Struktur der Eingabe kann man durch zusätzliche Techniken Verbesserungen bei SpMV herbeiführen? Frage: Wie könnte man CSR anpassen, damit ein gewisser Grad von Einfügungen und Löschungen von Kanten toleriert werden kann? 158