Algorithmen für große Datenmengen Algorithmen für große Datenmengen Motivation Algorithmen für große Datenmengen “One of the few resources increasing faster than the speed of computer hardware is the amount of data to be processed.” Bin Hu Call-for-Papers, IEEE InfoVis 2003 Algorithmen und Datenstrukturen 2 Arbeitsbereich fr Algorithmen und Datenstrukturen Institut fr Computergraphik und Algorithmen Technische Universität Wien Algorithmen für große Datenmengen Motivation Speichermodell Algorithmen für große Datenmengen Motivation Speicherzugriff Algorithmus 1 Testprogramm A 1: Array B = 1, 2, . . . , n; 2: für i = 1, . . . , n { 3: A[B[i]] = A[B[i]] + 1; 4: } Geschwindigkeitserhöhung pro Jahr Prozessoren: 30% – 50% Speicher: 7% – 10% Algorithmus 2 Testprogramm B 1: Array B = 1, 2, . . . , n; 2: Array C = RandomPermute(B); 3: für i = 1, . . . , n { 4: A[C [i]] = A[C [i]] + 1; 5: } Algorithmen für große Datenmengen Motivation Speicherzugriff Algorithmen für große Datenmengen Motivation Speicherzugriff Probleme klassischer Algorithmen Zugriff im Hauptspeicher spricht einzelne Elemente an Zugriff im Externspeicher (ein I/O) liefert ganze Blöcke von Daten zurück Geringe Lokalität bei Speicherzugriffen ⇒ mehr Zugriffe als nötig Algorithmen für große Datenmengen Algorithmen für große Datenmengen Externspeicher Algorithmen Sekundärspeichermodelle Parameter N = Anzahl der Elemente in der Input-Instanz Part I M = Anzahl der Elemente, die in den Hauptspeicher passen B = Anzahl der Elemente, die in einem Block passen Externspeicher Algorithmen Annahmen: M<N 1 ≤ B ≤ M/2 Algorithmen für große Datenmengen Externspeicher Algorithmen Sekundärspeichermodelle Algorithmen für große Datenmengen Externspeicher Algorithmen Sekundärspeichermodelle Vitter und Shriver (1994) D verschiedene, unabhängige Disks Pro I/O Zugriff können D · B Elemente bewegt werden Aggerwal und Vitter (1988) → Parallel Disk Model Disk mit P ≥ 1 unabhängige Zugriffsköpfe Pro I/O Zugriff können P · B Elemente bewegt werden Nicht praxisnah, da Zugriffsköpfe nicht unabhängig voneinander steuerbar sind Algorithmen für große Datenmengen Externspeicher Algorithmen Performance Algorithmen für große Datenmengen Externspeicher Algorithmen Anwendungsfall Prioritätswarteschlangen (Priority Queue) Maß für Performance Anzahl der ausgeführten I/O-Operationen Anzahl der ausgeführten CPU-Operationen im RAM-Modell Anzahl der belegten Blöcke auf dem Sekundärspeicher Datenstruktur zum Speichern von Tupeln aus Information und Prioritätswert Einsatz Dijkstras Shortest-Path Algorithmus Sortieren (z.B. Heapsort) Scheduling ... Algorithmen für große Datenmengen Externspeicher Algorithmen Anwendungsfall Algorithmen für große Datenmengen Unterstützte Operationen Insert: Einfügen eines neuen Elements in die Warteschlange Get Min: Ausgabe des Elements mit kleinstem Schlüssel Part II Del Min: Ausgabe und Entfernung des Elements mit dem kleinsten Schlüssel aus der Liste Externe Array-Heaps Frage Welche Datenstruktur würden Sie verwenden? Algorithmen für große Datenmengen Externe Array-Heaps Aufbau und Eigenschaften Bestandteile Interne Datenstruktur H im Arbeitsspeicher Externe Datenstruktur aus einer Menge von sortierten Arrays unterschiedlicher Länge Algorithmen für große Datenmengen Externe Array-Heaps Aufbau und Eigenschaften Interne Datenstruktur H, aufgeteilt in Heaps H1 und H2 H1 enthält maximal 2c · M Elemente (c ≤ 1) H2 enthält maximal die B kleinsten Elemente aus jedem Slot Externe Datenstruktur Besteht aus L Schichten Li , 1 ≤ i ≤ L Jede Schicht hat µ = (c · M/B) − 1 Slots Jeder Slot hat Länge li = (c · M)i /B i−1 Jeder Slot ist leer oder enthält eine sortierte Folge von höchstens li Elementen ⇒ Slot li+1 kann alles aus Schicht Li plus li Elemente aufnehmen Algorithmen für große Datenmengen Externe Array-Heaps Aufbau und Eigenschaften Algorithmen für große Datenmengen Externe Array-Heaps Operationen Größenordnung Maximal 2cM + BµL ≤ 2cM + B( cM B )L = cM(2 + L) Elemente für H1 und H2 Zusätzlich cM Zwischenspeicher für Operationen ⇒ M ≥ cM(3 + L), also L ≤ 1 c −3 Algorithmen für große Datenmengen Externe Array-Heaps Operationen Del Min Invariante: Das kleinste Element befindet sich immer in H H wird in H1 und H2 aufgeteilt: H1 enthält die neu eingefügten Elemente, maximal 2cM H2 speichert maximal die B kleinsten Elemente aus jedem belegten Slot Insert Versucht das Element in H1 einzufügen Ist dieser voll, kommen l1 = c · M Elemente in die externe Datenstruktur: Ist ein freier Slot in Schicht L1 vorhanden, werden die Elemente dort sortiert eingefügt Sonst werden alle Elemente aus L1 mit den l1 Elementen aus H vereinigt und in L2 eingefügt Ist diese auch voll, wird der Prozess mit L3 wiederholt, usw. Algorithmen für große Datenmengen Externe Array-Heaps Hilfsoperationen Hilfsoperationen Merge-Level Store Load Compact Algorithmen für große Datenmengen Externe Array-Heaps Hilfsoperationen Merge-Level(i, S, S 0 ) Produziert eine sortierte Folge S 0 durch das Mischen der sortierten Sequenz S und der µ Slots in Li (inkl. der ersten Blöcke in H2 ) Analyse: O(li+1 /B) I/O’s Algorithmen für große Datenmengen Externe Array-Heaps Hilfsoperationen Algorithmen für große Datenmengen Externe Array-Heaps Hilfsoperationen Store(i, S) Annahme: Li enthält einen leeren Slot und Folge S besitzt Länge im Bereich [li /2, li ] S wird in einen leeren Slot von Li gespeichert und seine kleinsten B Elemente nach H2 bewegt. Analyse: O(li /B) I/O’s Algorithmen für große Datenmengen Externe Array-Heaps Hilfsoperationen Compact(i) Load(i, j) Holt die nächsten B kleinsten Elemente vom j-ten Slot aus Li in den internen Heap H2 Analyse: O(1) I/O’s Annahme: es existieren mind. 2 Slots in Li , die zusammen (inkl. den Elementen in H2 ) höchstens li Elemente haben Diese beiden Slots werden zusammengefügt, sodass ein Slot in Li frei wird Die kleinsten B Elemente werden nach H befördert Analyse: O(li /B) I/O’s Algorithmen für große Datenmengen Externe Array-Heaps Analyse Algorithmen für große Datenmengen Externe Array-Heaps Experimenteller Laufzeitvergleich Experiment 1 Zuerst N Elemente in eine leere Prioritätswarteschlange Einfügen, dann alle entfernen Analyse Insert: 18 B (logcM/B (N/B)) I/O Operationen Del Min: 7/B I/O Operationen (Amortisierte Analyse, Beweis siehe Skriptum) Algorithmen für große Datenmengen Externe Array-Heaps Experimenteller Laufzeitvergleich Algorithmen für große Datenmengen Experiment 2 Ausgehend von einer Prioritätswarteschlange mit 20 Millionen Elementen wird zufällig Insert oder Del Min aufgerufen Part III Cache-optimale Algorithmen Algorithmen für große Datenmengen Cache-optimale Algorithmen Cache Cache Cache ist der schnellste Speicher, auf die der Prozessor zugreifen kann und enthält Regionen des (langsamen) Arbeitsspeichers, die zuletzt referenziert wurden Hit: Zugriff auf Speicherbereiche im Cache, kann mit Prozessorgeschwindigkeit bearbeitet werden Miss: Zugriff auf Speicherbereiche außerhalb vom Cache, Daten müssen vom Arbeitsspeicher nachgeleden werden Parameter Kapazität Z Seitengröße L Algorithmen für große Datenmengen Cache-optimale Algorithmen Ausnutzung des Caches Ausnutzung des Caches Cache-Aware (Cache-bewusst): Algorithmus enthält Parameter, mit denen das Cache Verhalten für Kapazität Z und Seitengröße L optimiert wird Cache-Oblivious (Cache-ignoroerend): sonst Beispiel: Matrix-Multiplikation Multiplikation zweier n × n Matrizen: C = A · B Matrizen zeilenweise gespeichert n sehr groß, d.h. n L Algorithmen für große Datenmengen Cache-optimale Algorithmen Lokalitäten Zeitliche Lokalität Merkmal: Ein Speicherbereich wird innerhalb einer kurzen Zeitspanne öfters angesprochen Ausnutzung: Angesprochene Speicherbereiche möglichst lange im Cache behalten Örtliche Lokalität Merkmal: Speicherbereiche werden angesprochen, die nahe beieinander liegen Ausnutzung: Bei einem Miss jeweils ganze Speicherblöcke in den Cache holen Algorithmen für große Datenmengen Cache-optimale Algorithmen Beispiel: Matrix-Multiplikation Algorithmus 3 BLOCK-MULT (A, B, C , n) 1: für i = 1 bis n/s { 2: für j = 1 bis n/s { 3: für k = 1 bis n/s { 4: MULT(Aik , Bkj , Cij , s) 5: } 6: } 7: } Cache-Aware Algorithmus MULT (A, B, C , s): Standard-Prozedur, die C = C + AB auf s × s Untermatrizen in Zeit O(s 3 ) berechnet s sollte so gewählt sein, dass die s × s Untermatrizen zusammen in den Cache passen Algorithmen für große Datenmengen Cache-optimale Algorithmen Beispiel: Matrix-Multiplikation Cache-Oblivious Algorithmus Nach dem Divide&Conquer Prinzip wird die Multiplikation schrittweise in Teilmultiplikationen aufgeteilt Sobald das Unterproblem ganz in den Cache passt, kann es ohne Misses gelöst werden Algorithmen für große Datenmengen Zusammenfassung Externspeicher Algorithmen Algorithmen, die versuchen, organisiert und strukturiert auf den Sekundärspeicher zuzugreifen, um die Anzahl an I/O Operationen zu minimieren Wozu? Geschwindigkeit von Speicher kann nicht mit der CPU mithalten Sekundärspeicher ist groß, aber langsam Zugriffe liefern ganze Blöcke von Daten Algorithmen für große Datenmengen Part IV Zusammenfassung