parallelisieren
no way to compare when less than two revisions
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | parallelisieren [2014-05-25 16:24] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Parallelisieren ====== | ||
+ | > // The Free Lunch is over. // | ||
+ | >> --- Herb Sutter | ||
+ | Über Jahrzehnte haben Programmierer die Laufzeit-Effizienz von Programmen vernachlässigt. | ||
+ | Emulatoren, virtuelle Maschinen, interpretierende Systeme konnten von | ||
+ | schnelleren Prozessoren mit immer mehr Speicher profitieren. | ||
+ | Doch schon dabei hatte (nicht nur) ich den Eindruck, | ||
+ | dass die Hardware langsamer beschleunigt als die Software langsamer wird. | ||
+ | Die Taktraten wachsen nicht mehr, wie | ||
+ | [[http:// | ||
+ | vom März 2005 zeigt. | ||
+ | Allenfalls die Zahl der Rechenkerne pro Maschine steigt noch ein paar Jahre. | ||
+ | |||
+ | Ein Zuwachs an Leistungsfähigkeit ist nicht mehr kostenlos zu haben. | ||
+ | [[wpde> | ||
+ | auf mehrere Rechenkerne, | ||
+ | Dazu müssen die Programmquellen verändert werden. | ||
+ | Prozessoren und Compiler können nur begrenzt erkennen, | ||
+ | welche Teile eines Programms für nebenläufige Abarbeitung geeignet sind. | ||
+ | Zur Wahl geeigneter Algorithmen, | ||
+ | kommen noch ein paar alte, fast in Vergessenheit geratene Tugenden: | ||
+ | Programmierdisziplin, | ||
+ | Nebenbei spielt auch die Wahl der Programmiersprache eine Rolle. | ||
+ | Hier werden Ansätze in C++ untersucht. | ||
+ | |||
+ | ===== Amdahls Gesetz ===== | ||
+ | {{ : | ||
+ | |||
+ | Die Geschwindigkeitssteigerung (engl. speedup) S eines parallelisierbaren Programms hängt von der Anzahl n verfügbarer Prozessoren bzw. Kerne ab: | ||
+ | \[ | ||
+ | S(n) = \frac{t_{\rm sequentiell}}{t_{\rm parallelisiert}} = \frac{1}{1-p + \frac{p}{n}} < \frac{1}{1-p}. | ||
+ | \] | ||
+ | Darin ist 0 ≤ p ≤ 1 der Anteil parallelisierter Schritte. | ||
+ | In [[http:// | ||
+ | In der modifizierten Form (grüne Kurve) | ||
+ | \[ | ||
+ | S(n) = \frac{1}{1-p + k \cdot n + \frac{p}{n}} | ||
+ | \] | ||
+ | existiert ein ausgeprägtes Optimum für die Prozessorzahl, | ||
+ | |||
+ | |||
+ | ===== Ansätze ===== | ||
+ | Die Rechenarbeit wird auf mehrere Kerne einer Maschine verteilt durch | ||
+ | * ausdrückliches Multithreading (POSIX / Boost / C++11 < | ||
+ | * implizites Multithreading in [[http:// | ||
+ | * Einspannen der Grafikprozessoren in [[http:// | ||
+ | Stehen mehrere Maschinen zur Verfügung, kommen | ||
+ | * allgemeine verteilte Systeme (Client/ | ||
+ | * Message Passing Interface ([[http:// | ||
+ | zum Einsatz. | ||
+ | ===== Beispiele ===== | ||
+ | {{ : | ||
+ | |||
+ | Um einen Eindruck zu gewinnen, wurde dieselbe Programmieraufgabe (Berechnung eines Apfelmännchens) mit mehreren Techniken umgesetzt; | ||
+ | die Ausgabe des Rechenergebnisses als Bilddatei (Abb. rechts) erlaubt ein leichtes Erkennen von Fehlern: | ||
+ | * [[parallel: | ||
+ | * [[parallel: | ||
+ | * [[parallel: | ||
+ | * [[parallel: | ||
+ | * [[parallel: | ||
+ | |||
+ | ===== Einschätzung ===== | ||
+ | Die Tabelle fasst die gemachten Erfahrungen zusammen: | ||
+ | |||
+ | | | ||
+ | ^OpenMP | ||
+ | ^PPL |Templates, Lambdas, Threadpool |gering |Visual C++ 2010 || 1,9| | ||
+ | ^OpenCL | ||
+ | ^Open MPI |Bibliothek |hoch |GCC, Linux |ssh-Zugriff auf alle beteiligten Maschinen | ---| | ||
+ | |||
+ | OpenMP und MPI weisen die größte Reife auf und können ergänzend genutzt werden, MPI ist auf Rechnerclustern skalierbar. | ||
+ | OpenCL ist noch relativ jung und wegen der Abhängigkeit von Fähigkeiten der Grafikkarte und weiterer Software noch wenig portabel, verspricht aber bei vielen Grafikkernen große Geschwindigkeitsgewinne. | ||
+ | |||
+ | Weitere Messungen wurde an [[parallel: |
parallelisieren.txt · Zuletzt geändert: 2014-05-25 16:24 von 127.0.0.1