Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Einführung in Optimierungsprobleme auf modernen Rechnerarchitekturen

Ähnliche Präsentationen


Präsentation zum Thema: "Einführung in Optimierungsprobleme auf modernen Rechnerarchitekturen"—  Präsentation transkript:

1 Einführung in Optimierungsprobleme auf modernen Rechnerarchitekturen
Anton Peißinger Fakultät für Informatik Technische Universität München

2 Überblick Warum Optimierung Überblick über verschiedene Architekturen
Sequentielle Rechner RISC Vektorrechner Parallele Rechner Multiprozessor Multicomputer Sequentielle Programmoptimierung Superskalarität Effiziente Ausnutzung des Cache Optimierung paralleler Programme Zusammenfassung, Ausblick

3 Warum Optimierung Ein einführendes Beispiel: Matrixmultiplikation
2 Matrizen mit jeweils Elementen Ohne Optimierung: Dauer 481,95 sec  8 min Mit Optimierung (Blocking und Loop unrolling) Dauer 326,94 sec  5,5 min  Durch Ausnutzung der architekturspezifischen Besonderheiten Beschleunigung der Software Warum Optimierung? Prozessoren werden immer schneller, warum soll dann optimiert werden? Verdeutlichung am Beispiel Matrixmultiplikation Rechner: 166MHz Pentium unter Linux 2 Matrizen mit jeweils Elementen (1024x1024) ohne Optimierung Dauer 481,95 sec  8 min mit Optimierung (Blocking und Loop unrolling) Dauer 326,94 sec  5,5 min mit Optimierung wird die gleiche Aufgabe in 2/3 der Zeit erledigt Vertrautmachen mit den Besonderheiten der verwendeten Rechnerarchitektur Ausnutzung dieser Besonderheiten zur Beschleunigung von Software

4 RISC Architektur Cache Mehrere funktionale Einheiten Pipelining
 Ausführen mehrerer Befehle in einem Zyklus Cache: kleiner, schneller Speicher, der aktuelle Daten und Befehle enthält. Findet CPU benötigte Daten nicht im Cache, wird Cache- Fehlzugriff (Cache-miss) signalisiert und Daten werden aus dem Hauptspeicher geholt. CPU muß warten, bis Daten verfügbar sind. Mehrere funktionale Einheiten: -Prozessor kann mehrere Operationen in einem Zyklus ausführen; Zwei Fälle: -Prozessor kann mehrere Fließkommaeinheiten besitzen -Zusammenfassung zweier Operationen in einem Assemblerbefehl Bsp.: IBM RS/6000 POWER2 2 Fließkommaeinheiten; Ausführung von 4 Fließkommaoperationen pro Zyklus Pipelining: entspricht einer Art Fließband Jeder Schritt in der Pipeline vollendet einen Teil des Befehls Befehle treten an einem Ende ein, werden verarbeitet und treten am anderen Ende wieder aus In jedem Zyklus kann eine neue Operation gestartet werden Mehrere Befehle können in einem Zyklus ausgeführt werden; wichtig für die Optimierung

5 Vektorarchitektur Besteht aus Pipeline-Skalareinheit ergänzt um Vektoreinheit Speicherung der Daten in Form von Vektoren Vektoroperationen zwischen den Vektorregistern durchgeführt Performancegewinn nur durch Vektoroperationen Zusätzlich zur Skalareinheit sind Vektorregister vorhanden Dort können Daten in Form von Vektoren abgelegt werden Vektorfunktionseinheiten sind Pipelines; starten in jedem Zyklus eine neue Operation Performancegewinn nur durch Vektoroperationen Bei Speicherung der Daten in Form von Skalaren ist Vektorrechner eher langsamer entscheidend für die Optimierung

6 Multiprozessortechnologie
Geringe Anzahl von Prozessoren Jeder Prozessor besitzt eigenen Cache Prozessoren teilen sich einen Speicher (shared memory) Bei Bedarf Synchronisation Geringe Anzahl von Prozessoren; jeder verfügt über eigenen Cache Prozessoren teilen sich einen Hauptspeicher Engpässe können auf dem Bus oder im Hauptspeicher auftreten, da alle Prozessoren über den selben Bus auf einen Hauptspeicher zugreifen Einzelne Prozessoren müssen synchronisiert werden, d. h. Warten, bis Parallelcode ausgeführt ist, dann Ausführen des Skalarcodes bis zum nächsten Parallelcodeabschnitt usw.

7 Multicomputerarchitektur
Mikroprozessoren sind über Netzwerk miteinander verbunden Prozessoren besitzen eigenen Hauptspeicher Prozessoren führen sequentiellen Code aus Falls alle Prozessoren gleiches Programm ausführen, spricht man von Single Programm/Multiple Data Prozessoren können Informationen von anderen Prozessoren nur über das vorhandene Netzwerk erhalten entscheidender Punkt bei der Optimierung Zusammenfassung der Merkmale der Architekturen PE´s sind gewöhnliche Mikroprozessoren Jeder Prozessor führt sequentiellen Code aus Austausch von Informationen durch Nachrichten über Netzwerk

8 Superskalarität Ausnutzung mehrerer Fließkommaeinheiten des Prozessors
Transformation, Veränderung von Schleifen Nutzung der Pipeline (Softwarepipelining) Prozessor besitzt mehrere Fließkommaeinheiten Um Geschwindigkeit zu steigern, sollten möglichst alle vorhandenen Einheiten benutzt werden Geschieht zum Beispiel durch Transformation von Schleifen (loop unrolling) Nutzung der Pipeline (Softwarepipelining) Ähnlich Hardwarepipeline, die Operationen auf Prozessorebene beschleunigt. Aufspaltung eines einzelnen kompletten Schleifendurchlaufs in mehrere Instruktionen und zwar so, daß alle funktionalen Einheiten beschäftigt sind.

9 Beispiel zur Superskalarität
Addition zweier Vektoren do i=1, n y(i)=y(i)+a*x(i) enddo  zwei Fließkommaoperationen in 7 Zyklen do i=1, n-1, 2 y(i+0)=y(i+0)+a*x(i+0) y(i+1)=y(i+1)+a*x(i+1) do i=i, n  vier Fließkommaoperationen in 8 Zyklen R10000 RISC bis zu 4 Instruktionen pro Zyklus 1 pipelined load/store unit 2 pipelined 64 Bit int ALU 1 pipelined floatingpoint adder 1 pipelined floatingpoint multiplier Normale Vorgehensweise ohne Optimierung floatingpoint adder und floatingpoint multiplier werden gleichzeitig benützt aber Pipeline wird nicht ausgenützt 2 Fließkommaoperationen in 7 Zyklen Optimierte Version Beide Operationen werden nacheinander gestartet und durch Pipelining beschleunigt 4 Fließkommaoperationen in 8 Zyklen

10 Maschinencode zum Beispiel
Ohne Optimierung Cycle 0: ld x x++ Cycle 1: ld y Cycle 2: Cycle 3: madd Cycle 4: Cycle 5: Cycle 6: st y br y++ Mit Optimierung Cycle 0: ld x Cycle 1: ld x1 Cycle 2: ld y0 x+=4 Cycle 3: ld y1 madd0 Cycle 4: madd1 Cycle 6: st y0 Cycle 7: st y1 y+=4 br Anschaulicher am Maschinencode: Ohne Optimierung: 2 Fließkommaoperationen in 7 Zyklen madd sind zwei Operationen Zyklus 2, 4, 5 ohne Operationen, da load (ld) und multiply-add(madd) gewisse Zeit brauchen, bis die Werte zur Verfügung stehen Mit Optimierung klar ersichtlich sind beide madd-Operationen madd werden nacheinander gestartet (Pipelining wird ausgenützt) einziger leerer Zyklus ist 5

11 Speicherproblematik Hauptspeicher zu langsam Beispiel: RISC CPU
- bis zu vier Fließkommaoperationen pro Zyklus - Hauptspeicher: 0.2 Fließkommaoperanden pro Zyklus Latenzzeit größer als 60 Zyklen  effiziente Ausnutzung der Speicherhierarchie Hauptspeicher zu langsam für CPU, d. h. CPU verbringt meiste Zeit mit Warten, wenn Daten aus dem Hauptspeicher benötigt werden Bsp.: RISC-CPU CPU schafft bis zu 4 Fließkommaoperationen pro Zyklus aber Hauptspeicher liefert nur 0.2 Operanden pro Zyklus Latenzzeit (Zeit bis zur Reaktion) über 60 Zyklen Um Datenbeschaffung zu beschleunigen, muß die Speicherhierarchie des Computers effizient ausgenützt werden (zum Beispiel Verwendung des Cache) Bsp.: DEC PWS 600 A21164 (Folie 12)

12 Speicherhierarchie Beispiel: DEC PWS 600 A21164
Kapazität Bandbreite Latenzzeit 256 Byte MB/s 1.7 ns 8 KByte MB/s 1.7 ns 96 KByte 9600 MB/s 5.0 ns 2 MByte 970 MB/s 23.3 ns 1536 MByte 1070 MB/s ns CPU Register 1. Level Cache 2. Level Cache 3. Level Cache Hauptspeicher Swap Space

13 Effiziente Ausnutzung des Cache
Prefetching Reuse Blocking Beispiel Matrixmultiplikation: for i=1 to n do for j=1 to n do for k=1 to n do C[i,j]=C[i,j]+A[i,k]*B[k,j] endfor Prefetching Cache ist unterteilt in Cachelines Werden Daten benötigt, die nicht im Cache stehen, dann wird eine komplette Cacheline in den Cache geladen (auch Wörter, die in der Nähe des benötigten Wortes stehen) Falls auszuführendes Programm genügend Datenlokalität besitzt, stehen später benötigte Wörter bereits im schnellen Cache und nicht im langsamen Hauptspeicher Reuse Daten, die aus dem Cache gelesen werden, werden nicht sofort verworfen, sondern erst aus dem Cache gelöscht, wenn der Cache keinen Platz zur weiteren Aufnahme von Daten bietet Es können oft benötigte Daten so im schnellen Cache gehalten werden Blocking Aus den benötigten Daten werden Blöcke gebildet, die in den Cache passen und schnellen Datenzugriff sichern Beispiel Matrixmultiplikation: Vorüberlegungen: Eine Cacheline entspricht einer Matrixzeile; Matrix größer als Cache Gewöhnliche Code ohne Optimierung (ijk-Schleifenanordnung): Zeilen der Matrix werden als Cachelines abgelegt. Bei Matrix A stehen später benötigte Daten bereits im Cache (Prefetching), innerste Schleife arbeitet Zeile von A ab. Bei Matrix B arbeitet k-Schleife Spalte ab nur ein Element der Zeile Rest unnötig i i k = k j j C A B

14 Beispiel Matrixmultiplikation
Mit Cache-Optimierung: for i=1 to n do for k=1 to n do for j=1 to n do C[i,j]=C[i,j]+A[i,k]*B[k,j] endfor i j i k j Mit Optimierung: Voraussetzung : Cache kann gleichzeitig eine Zeile von C und B halten Umstellung der Schleifen (ikj) Innerste Schleife arbeitet bei Matrizen C und B jeweils eine Zeile ab Gegensatz zur nicht optimierten Version: Hier wird Matrix B zeilenweise abgearbeitet, nicht spaltenweise falls Cache gleichzeitig keine Zeile von C und B halten kann, Verwendung von Blocking, so daß Zeilen in den Cache passen  effiziente Cacheausnutzung durch Prefetching = k C A B

15 Optimierung paralleler Programme
Shared Memory: Engstelle ist Hauptspeicher, bzw. Bus  Cache-Optimierung, wie bei RISC Distributed Memory: Erweiterung der Speicherhierarchie Benötigte Daten befinden sich im direkt zugänglichen Speicher  Reduzierung der Netzwerkommunikation Neuberechnung oft schneller als Übermittlung (Beispiel IBM SP2) Shared Memory (Multiprozessor): Zugriffe auf Hauptspeicher so gering wie möglich halten Engstelle ist Hauptspeicher bzw. Bus Optimierung ähnlich RISC-Prozessoren Anwendung der Cacheoptimierung für jeden der Prozessoren Distributed Memory (Multicomputer): Erweiterung der Speicherhierarchie um Netzwerk; sehr langsam Ziel: Reduzierung der Netzwerkkommunikation ähnlich wie bei Cache-Optimierung sollen Daten im direkt zugänglichen Speicher stehen; Anforderung der Daten über Netzwerk entfällt somit Neuberechnung oft schneller: Bsp.: IBM SP2: Bandbreite des Netzwerks 32MB/s Taktfrequenz 66 MHz alle 8 Zyklen erhält Prozessor Fließkommazahl über Netzwerk aber: Neuberechnung dieser Zahl oft kürze als 8 Zyklen

16 Beispiel zur parallelen Optimierung
Matrixmultiplikation: - Parallelisierung der innersten Schleife for i=1 to n do for k=1 to n do doall j=1 to n do C[i,j]=C[i,j]+A[i,k]*B[k,j] enddoall endfor Parallelisierung der innersten Schleife: Schleifen bereits zu ikj umgestellt Verteilung der Befehle in der innersten Schleife auf mehrere Prozessoren Bild zeigt die ersten 4 Iterationen der j-Schleife auf 4 Prozessoren parallel ausgeführt. Hoher Synchronisationsaufwand Für alle n2 Iterationen der äußeren beiden Schleifen (sequentieller Code) müssen die Tasks synchronisiert werden i i k = k C A B

17 Beispiel zur parallelen Optimierung
Matrixmultiplikation: - Parallelisierung der äußersten Schleife doall i=1 to n do for k=1 to n do for j=1 to n do C[i,j]=C[i,j]+A[i,k]*B[k,j] endfor enddoall Parallelisierung der äußeren Schleife: Schleifen bereits zu ikj umgestellt Jeder Prozessor führt hier längeren sequentiellen Code aus Bild zeigt ersten 4 Iterationen der äußeren Schleife auf 4 Prozessoren Datenlokalität für C und A ist sehr gut (Prefetching) Nachteil jeder Prozessor benötigt die komplette Matrix B, um eine Zeile zu berechnen = C A B

18 „Grober“ Parallelismus „Feiner“ Parallelismus
Prozessor längere Zeit beschäftigt aber: Datenlokalität nicht gesichert Feiner Parallelismus kurze Rechenzeiten der Prozessoren aber: Erhöhung der Kommunikation Grober Parallelismus: Jeder Prozessor führt längeren sequentiellen Code aus Datenlokalität nicht gesichert; Prozessoren benötigen viele Daten, die nicht im eigenen Speicher (z.B. Cache abgelegt werden können) Feiner Parallelismus: Jeder Prozessor hat nur wenige Anweisungen auszuführen Erhöhung der Kommunikation Daten können im Cache gehalten werden Synchronisation verstärkt erforderlich Feiner Parallelismus bei shared memory da Cache für zuviele Daten zu klein (Bsp.: Folie 16) Grober Parallelismus bei distributed memory weniger Kommunikation zwischen den Prozessoren (Bsp..: Folie 17)

19 Zusammenfassung, Ausblick
Optimierung doch sinnvoll Besonderheiten der Rechnerarchitektur müssen bekannt sein Softwareentwickler müssen die meisten Optimierungen noch selbst durchführen Integration verschiedener Optimierungsmöglichkeiten in den Compiler wäre wünschenswert Zusammenfassung: Man sieht, daß Optimierung in dieser Hinsicht geschwindigkeitssteigernd ist Um Programme zu beschleunigen muß man die Architektur der Rechner kennen Die meisten Optimierungen müssen noch vom Entwickler selbst durchgeführt werden Es wäre wünschenswert, wenn Compilerentwickler Optimierungen integrieren würden, da Programmentwickler mit großer Wahrscheinlichkeit nicht alle möglichen Optimierungen verwenden

20 Literatur [1] Wm. A. Wulf and Sally A. McKee, Hitting the Memory Wall: Implications of the Obvious, Computer Science Report No. CS-94-48, University of Virginia, 1994 [2] S. Goedecker, Achieving high performance in numerical computations on RISC workstations and parallel systems, Max-Planck Institue for Solid State Research, Stuttgart, 1997 [3] John L. Hennessy, Computer Architecture. A quantitative Approach, Morgan Kaufmann Publishers, Inc., San Mateo, 1990


Herunterladen ppt "Einführung in Optimierungsprobleme auf modernen Rechnerarchitekturen"

Ähnliche Präsentationen


Google-Anzeigen