36
Inhaltsverzeichnis Vergleich von Posix-Threads, OpenMP und UPC C++ und OpenMP Ergebnisse und Ausblick Shared-Memory Parallelisierung von C++ Programmen Christian Terboven 9. Februar 2006 Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Shared-Memory Parallelisierung von C++Programmen

Christian Terboven

9. Februar 2006

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 2: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

1 Vergleich von Posix-Threads, OpenMP und UPCUbersichtErgebnisseZusammenfassung

2 C++ und OpenMPThread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

3 Ergebnisse und Ausblick

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 3: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

UbersichtErgebnisseZusammenfassung

Ubersicht

Verbreitete Parallelisierungstechniken fur Shared-Memory:OpenMP: Direktiven-gesteuerte Shared-MemoryParallelisierung fur C, C++ und FORTRAN.Posix-Threads: Shared-Memory (System-)Bibliothek mitumfangreicher Funktionalitat, sprachunabhangig.UPC: Ubermenge von C99 mit Distributed-Shared-MemoryModell, kann mit C++ kombiniert werden.MPI-2: wurde hier nicht betrachtet.

Betrachtung der Parallelisierung des STREAM-Benchmarksund der DROPS Programmkernel.

Vergleichskriterien:Vorgehensweise, Tool-Unterstutzung.Performance und Aufwand.Performance nach Tuning.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 4: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

UbersichtErgebnisseZusammenfassung

Performance: STREAM-Benchmark

0

1

2

3

4

5

6

7

8

1 2 3 4 5 6 7 8

Spe

edup

Threads

C OpenMP = 1C Posix-Threads

C UPCIdeal

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 5: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

UbersichtErgebnisseZusammenfassung

Aufwand fur Tuning

Opteron-Plattform hat ccNUMA-Eigenschaften:Datenlokalitat berucksichtigen!

OpenMP: Initialisierungsschleife mit gleicher (paralleler)Arbeitsverteilung wie die Berechnung.Posix-Threads:

Initialisierungsschleife.Thread-Pool zur Vermeidung des Aufwandes der Erstellungund Beendigung von Threads.CPU-Binding der Threads.

UPC:Datenlokalitat ist kein Problem.Compiler erzeugt

”schlechten“ Code.

Verschiedene manuelle Optimierungen im Code und imCompiler (beta) verwenden.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 6: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

UbersichtErgebnisseZusammenfassung

Performance: STREAM-Benchmark (tuned)

0

1

2

3

4

5

6

7

8

1 2 3 4 5 6 7 8

Spe

edup

Threads

C OpenMPC Posix-Threads

C UPCIdeal

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 7: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

UbersichtErgebnisseZusammenfassung

Zusammenfassung

Alle drei Parallelisierungstechniken eignen sich fur dieParallelisierung des STREAM-Benchmarks und DROPS.

UPC bietet leistungsfahige Moglichkeiten derDatenplatzierung. Ad-Hoc Parallelisierung ggfs. aufwandig.Posix-Threads:

Hohe Flexibilitat, auch fur die Programmierung irregularerCodes geeignet.Anpassung der Arbeitsverteilung ist aufwandig und mussmanuell programmiert werden.

OpenMP:Schnellste Entwicklung und großter Benutzerkomfort.Nur minimale Codeanderungen notwendig, Moglichkeit zurseriellen Compilation besteht weiter.Tool-Unterstutzung, z.B. Test auf serielle Aquivalenz.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 8: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

1 Vergleich von Posix-Threads, OpenMP und UPCUbersichtErgebnisseZusammenfassung

2 C++ und OpenMPThread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

3 Ergebnisse und Ausblick

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 9: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Thread-Safety

Ein Code ist thread-safe, wenn er bei gleichzeitigerAusfuhrung durch mehrere Threads korrekt ist.

Hier betrachtete STLs: Sun C++ und STLport (eng verwandtmit SGI STL), GNU C++ und Intels Modifikationen.

Zwei Szenarien:

Mehrere Threads greifen (schreibend) auf eine Instanz einesDatentypes zu.Mehrere Threads greifen (schreibend) auf mehrere Instanzenzu, nie mehr als ein Thread auf eine Instanz.

Eine Funktion ist reentrant, wenn:

sie nur Variablen vom Stack benutzt,sie nur von aktuellen Argumenten abhangt,alle aufgerufenen Funktionen es auch sind.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 10: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Ergebnis

Die betrachteten STLs bieten ausschließlich reentranteFunktionen an. In der Sun STL und in STLport enthaltenlediglich spezialisierte Allokatoren statische Variablen, die uberLocking geschutzt werden.

Zusammenfassung:

Ausschließlicher Lesezugriff ist sicher.Gleichzeitiger (schreibender) Zugriff mehrerer Threads aufmehrere unterschiedliche Instanzen ist sicher.Gleichzeitiger (schreibender) Zugriff mindestens eines Threadsmuss von der Applikation verwaltet werden.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 11: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Einleitung

Einige Datentypen haben sich als ungunstig zur Verwendungauf NUMA-Architekturen erwiesen, z.B: std ::valarray .

Eine Verteilung der Daten ist nach dem erstmaligen

”Anfassen“ nicht mehr direkt moglich.

Zwei Ansatze zur Verteilung der Daten:

Nutzung von Fahigkeiten des Betriebssystems (hier: Solaris)um Codemodifikationen zu minimieren.Nutzung von C++ Sprachmitteln mit der Hoffnung aufPortabilitat (First-Touch).

Moglichkeiten zur Allokation dynamischen Speichers:

Zeiger,Objekte aus Klassenbibliotheken (z.B. STL),Allgemeine Klassen.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 12: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Zeiger

Im Allgemeinen leicht an eine vorgegebene Datenverteilunganzupassen:

einzelner Zeiger auf Datenbereich kann explizit parallelinitialisiert werden,Array von Zeigern wird parallel verteilt angelegt.

Beispielcode ADI: Poisson-Loser. Berechnung erfolgt auf derVariablen gridPoint ∗∗ grid .Betriebssystem: Benutzung von pmadvise mit StrategieMADV ACCESS MANY .C++ und OpenMP: Optimierung der Verteilung beimAnlegen des Feldes:

// A l l o c a t i o n o f v a r i a b l e g r i d#pragma omp p a r a l l e l f o rf o r ( i n t i = 0 ; i < N; i++) {

g r i d [ i ] = new g r i dP o i n t ;}

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 13: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Performance: ADI mit Initialisierungstechniken

0

0.5

1

1.5

2

2.5

3

3.5

4

4.5

1 2 3 4 5 6 7 8

Spe

edup

Threads

originalpmadvise

parinit

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 14: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Objekte aus Klassenbibliotheken

Falls Objekte keine Moglichkeit zur Beeinflussung derSpeicherverwaltung anbieten:

Einsatz von Betriebssystemfunktionalitat, z.B. madvise().Modifikation des Objektes, z.B. im Konstruktor.

std ::valarray bietet keine Moglichkeiten uber seineSchnittstelle. Eine Modifikation der Allokationstechnik wurdedurchgefuhrt, ist aber nicht zwischen Compilern portabel.

std ::vector bietet in weiten Teilen die gleiche Schnittstelle,erlaubt aber zusatzlich die Angabe eines Allokators.

Ein Allokator ist eine Klasse, die Aufgaben derSpeicherverwaltung ubernimmt, und eine von der STLvorgegebene Schnittstelle implementiert.

Beim Austausch von std ::valarray mit std ::vector ist auf diePerformance zu achten.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 15: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Allokator-Framework

Framework zur Evaluation verschiedener Allokationstechniken:

Allokator: implementiert die von der STL geforderteSchnittstelle, verwendet HeapManager .HeapManager: verwaltet Speicher, der vom HeapLayerallokiert wurde.HeapLayer: allokiert physikalischen Speicher durch System-oder Bibliotheksaufrufe.

DistributedHeapAllocator : implementiert einen Allokator, derSpeicher direkt nach der Allokation mittels OpenMP parallelmit null beschreibt. Das Scheduling wird durch einenTemplateparameter festgelegt.

Der DistributedHeapAllocator kann mit std ::vector verwendetwerden.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 16: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Performance: STREAM-Benchmark mit Verteilung

0

1

2

3

4

5

6

7

8

1 2 3 4 5 6 7 8

Spe

edup

Threads

C++ OpenMP, madviseC++ OpenMP, vector

IdealC++ OpenMP, myvalarray

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 17: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Performance: Routine y Ax aus DROPS (sparse MatVec)

0

0.5

1

1.5

2

2.5

3

3.5

4

1 2 3 4

Spe

edup

Threads

OpenMPOpenMP dist-vector

Ideal

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 18: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Allgemeine Klassen

Uber ein Mixin kann die Speicherverwaltung einer Klassemodifiziert werden, wie in [Berger & Zorn + 01] vorgestellt.

template<c l a s s Object , c l a s s HeapManager>c l a s s PerC las sHeapMix in : pub l i c Object {pub l i c :i n l i n e vo id ∗ operator new ( s i z e t s z ) {

re tu rn getHeap ( ) . ma l l o c ( s z ) ;}s t a t i c HeapManager & getHeap ( ) {

s t a t i c HeapManager theHeap ;re tu rn theHeap ;

}[ . . . ]} ;

Die Allokation von Speicher wird vom HeapManagerverwaltet.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 19: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Ubersicht

Bei der Verwendung von Datenstrukturen, die viele kleineObjekte anlegen, wurden Probleme beimSpeichermanagement unter Solaris und Windows festgestellt.

Hier: Betrachtung von std ::map, aber auch mit std ::list undahnlichen Datentypen konnen ahnliche Probleme auftreten.

Unter Solaris werden spezielle Allokatoren zur effizientenseriellen Allokation verwendet.

Losungsansatze:Verwendung einer Betriebssystem-nahen Bibliothek zurparallelen Allokation, z.B. libmtmalloc.Modifikation der Speicherverwaltung seitens der Anwendungdurch Anforderung großerer Blocke.

std ::map erlaubt die Angabe eines Allokators.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 20: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Performance: MAP-Benchmark

0

1

2

3

4

5

6

1 2 3 4

Spe

edup

Threads

Linux = 1Linux, Chunk-Allokator

SolarisSolaris, mtmalloc

Solaris, mtmalloc, Chunk-AllokatorWindows

Windows, Chunk-Allokator

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 21: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Performance: Routine SetupSystem1 aus DROPS

0

0.5

1

1.5

2

2.5

3

3.5

4

1 2 3 4

Spe

edup

Threads

Linux, mallocLinux, Chunk-Allokator

Solaris, mtmallocSolaris, Chunk-Allokator + mtmalloc

Ideal

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 22: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Einleitung

Parallelisierung eines High-Level Codes:Interne Parallelisierung.Externe Parallelisierung.Verwendung in Parallelisierung (Thread-Safety).

PCG( const Mat& A, Vec& x , const Vec& b , . . . ){

Vec p ( n ) , z ( n ) , q ( n ) , r ( n ) ; Mat A(n , n ) ;[ . . . ]f o r ( i n t i = 1 ; i <= max i t e r ; ++i ){

q = A ∗ p ;double a lpha = rho / ( p ∗ q ) ;x += a lpha ∗ p ;r −= alpha ∗ q ;[ . . . ]

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 23: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Objektorientierte Codes

Es kann bereits aufwandig sein, seriell eine optimalePerformance zu erreichen (Template Expressions).Interne Parallelisierung: abgeschlossene parallele Regioninnerhalb der Memberfunktionen.

Vorteil: Keine Anderung der Schnittstelle, korrekteVerwendung garantiert.Nachteil: Aufwand beim Erzeugen und Beenden der Threads.

Ebenfalls zur internen Parallelisierung zahlen z.B. paralleleErweiterungen der STL. Diese konnen bei den betrachtetenCodes aber nicht gewinnbringend eingesetzt werden.Externe Parallelisierung: parallele Region außerhalb derMemberfunktionen, innerhalb wird Orphaning eingesetzt.

Vorteil: Verringerung des Aufwandes des Threadmanagements.Nachteil: Fehlerhafte Verwendung moglich.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 24: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Performance: objektorientierter PCG-Loser

Intel C++ Compiler 9.0 auf Sun Fire V40z:

Version 1 2 3 4Intern 219 108 83,2 65,5

Intern (temp. Vektor) 218 108 82,5 65,1

Extern 216 107 82,3 65

C-Code 216 107 82,3 65

Sun C++ Studio10 Compiler auf Sun Fire E6900:

Version 1 2 3 4 6 8Intern 375 185 156 112 68 42

Intern (temp. Vektor) 427 211 178 128 78 47

Extern 320 161 141 97 61 37

C-Code 315 157 138 95 57 35

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 25: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Parallelisierung von nicht OpenMP konformen Schleifen

Bei Verwendung von Zeigern oder Iteratoren (Kapselung einesZeigers in der STL) sind die entstehenden Schleifen nicht vonder kanonischen Form, wie sie OpenMP fordert.

Wichtigste Forderung: Berechnung der Schleifeniterationen imVorraus moglich. Dies wurde auch bei Iteratoren (distance())und Zeigern (Zeigerarithmetik) gehen.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 26: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Parallelisierung von nicht OpenMP konformen Schleifen

Ansatz 1: Erstellung einer parallelisierbaren Schleife:

long l = 0 , l S i z e = 0 ;f o r ( i t = l i s t 1 . beg i n ( ) ; i t != l i s t 1 . end ( ) ; i t++)

l S i z e ++;v a l a r r a y <CComputeItem∗> i t ems ( l S i z e ) ;f o r ( i t = l i s t 1 . beg i n ( ) ; i t != l i s t 1 . end ( ) ; i t++) {

i t ems [ l ] = &(∗ i t ) ; l ++;}#pragma omp p a r a l l e l f o r de f au l t ( sha r ed )f o r ( long l = 0 ; l < l S i z e ; l++) {

i t ems [ l ]−>compute ( ) ;}

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 27: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Parallelisierung von nicht OpenMP konformen Schleifen

Ansatz 2: Intels Taskqueuing:

#pragma i n t e l omp p a r a l l e l t a skq{f o r ( i t = l i s t 2 . beg i n ( ) ; i t != l i s t 2 . end ( ) ; i t++) {#pragma i n t e l omp ta sk{

i t−>compute ( ) ;}} // end f o r} // end omp p a r a l l e l

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 28: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Parallelisierung von nicht OpenMP konformen Schleifen

Ansatz 3: single−nowait Technik:

#pragma omp p a r a l l e l p r i v a t e ( i t ){f o r ( i t = l i s t 3 . beg i n ( ) ; i t != l i s t 3 . end ( ) ; i t++) {#pragma omp s i n g l e nowa i t{

i t−>compute ( ) ;}} // end f o r} // end omp p a r a l l e l

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 29: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Performance: parallele Iteratorschleifen

0

5

10

15

20

25

30

35

40

1 2 3 4

Tim

e (s

ec)

Threads

Intel,Exp1,5x1000Intel,Exp2,5x1000Intel,Exp3,5x1000

Intel,Exp1,40x1000Intel,Exp2,40x1000Intel,Exp3,40x1000

Sun,Exp1,2560x1Sun,Exp3,2560x1

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 30: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Kritik an der OpenMP Spezifikation (1)

Insgesamt war die Parallelisierung der betrachtetenAnwendungsprogramme mit OpenMP erfolgreich.

Bereits diskutiert: Schleifen mit Indexvariablen von anderemTyp als Integer.

Schleifen uber size t werden ebenfalls nicht akzeptiert, davorzeichenlos, aber haufig verwendet.

Die Privatisierung von Membervariablen wird nichtunterstutzt. Dies ware angenehm beim Chunk−Allokator undbei der internen Parallelisierung.

Eine Routine kann nicht erkennen, ob sie aus einemWorksharingkonstrukt aufgerufen wird. Dies ware zurGarantierung der Korrektheit bei der externen Parallelisierungangenehm.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 31: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

Kritik an der OpenMP Spezifikation (2)

Die OpenMP Spezifikation geht nicht in allen Punkten praziseauf die Programmiersprache C++ ein.

Privatisierung von Klassen:

OpenMP: Private Variablen sind nicht initialisiert.C++: Fur eine Instanz einer Klasse muss immer einKonstruktor aufgerufen werden.Der Intel C++ Compiler tut dies, der Sun C++ Compilernicht. Dies fuhrt zu schwer auffindbaren Fehlern.

Viele Compiler haben Schwierigkeiten, C++ Konstrukte wieExceptions, Templates, Vererbung im Zusammenhang mitOpenMP umzusetzen. Dies hat die Parallelisierung vonDROPS gezeigt.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 32: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

FIRE

Das Image-Retrieval System FIRE wird am Lehrstuhl furInformatik 6 der RWTH Aachen von Thomas Deselaers undDaniel Keysers entwickelt.Ziele von FIRE:

Vergleich von Bildmerkmalen (Features)Vergleich von Bildvergleichsmaßen (Distanzen)Untersuchung der Korrelation von Features

Die Parallelisierung wurde durch die objektorientierteProgrammierung stark unterstutzt (Aufwand: ca. 4 Wochen).Die Programmiersprache C++ hat die Abhangigkeitsanalysedeutlich vereinfacht.Die Flexibilitat der Entwicklung durfte nicht eingeschranktwerden. Bei der OpenMP Parallelisierung wurden nur wenigeZeilen Code hinzugefugt.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 33: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Thread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

FIRE

0

2.5

5

7.5

10

12.5

15

17.5

20

22.5

25

27.5

30

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

Spe

edup

Threads

batch()getScores()

Beste KombinationIdeal

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 34: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

1 Vergleich von Posix-Threads, OpenMP und UPCUbersichtErgebnisseZusammenfassung

2 C++ und OpenMPThread-Safety der STLDatenlokalitatAllokation kleiner ObjekteParallelisierung und ObjektorientierungKritik an der OpenMP SpezifikationParallelisierung von FIRE

3 Ergebnisse und Ausblick

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 35: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Zusammenfassung

OpenMP lasst sich gut zur Parallelisierung von C++Programmen einsetzen. Es bietet dem Programmierer denmeisten Komfort im Vergleich mit Posix-Threads und UPC.Skalierbarkeit von OpenMP C++ Programmen ist nichtimmer zwischen Hardwarearchitekturen, Betriebssystemen undCompilern portabel:

Opteron: NUMA-Architektur und Datenlokalitat.Solaris und Windows: Speicherverwaltung.Effizienz der OpenMP Implementierung.Diese Punkte konnen mit der aktuellen OpenMP Spezifikationnicht direkt adressiert werden.Die C++ Programmiersprache bietet Losungsansatze.

Objektorientiertes Design kann ungewollte Abhangigkeiten imCode verhindern und die Abhangigkeitsanalyse erleichtern.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen

Page 36: Shared-Memory Parallelisierung von C++ Programmen · Nutzung von C++ Sprachmitteln mit der Hoffnung auf Portabilit¨at ( First-Touch). M¨oglichkeiten zur Allokation dynamischen

InhaltsverzeichnisVergleich von Posix-Threads, OpenMP und UPC

C++ und OpenMPErgebnisse und Ausblick

Ende

Vielen Dank fur Ihre Aufmerksamkeit.

Christian Terboven Shared-Memory Parallelisierung von C++ Programmen