prio.powerday: Einführung in die parallele Programmierung

veröffentlicht von Michael Hülskötter am 23. April 2009

Jetzt sind mit kaum einer halben Stunde Verspätung Ralf Westphal und Bernd Marquardt dran. Sie wollen uns erst mal erzählen, was parallele Programmierung eigentlich bedeutet.

Zunächst geht es um echte Basics wie Multithreading mit Single- und Multicores. Fakt ist: Multithreading allein bringt gar nichts, dafür sind mehrere Prozessoren und die Zerlegung eines Programms in parallel zu verarbeitenden Bereiche notwendig.

Eine weitere Herausforderung sind Latenzzeiten, die sich aus asynchroner Prozessorverarbeitung ergeben. Das lässt sich mithilfe einer Kombination aus Multithreading und Multitasking auf mehreren Prozessoren optimieren.

Es gilt aber zugleich, den Durchsatz zu erhöhen. Dies gelingt ausschließlich auf Multicore-Systemen.

Es gibt ein grundsätzliches Problem bei der Parallelverarbeitung: den Zugriff auf gemeinsame Ressourcen. Diese Herausforderung meistern Zugriffskontrollen mithilfe explizierter Sperren. Hierfür sperren zum Beispiel einzelne Tasks gemeinsamen Speicher. Allerdings müssen die Zeitspannen und die Granularität dieser Sperren genau passen. Ein große Gefahr hierbei sind übrigens mögliche Deadlocks, die gerade bei parallel programmierten Anwendungen erst zur Laufzeit auftreten. Deadlocks lassen sich durch dieselbe Sperrreihenfolge vermeiden.

Jetzt redet Bernd über Data Races, die immer dann entstehen, wenn mehrere Threads auf dieselbe Ressource wie eine Variable schreibend zugreifen. Und das ist leider nicht vorhersehbar, da der schnellere Thread meist “gewinnt”.

Abschließend geht Bernd noch auf das Gesetz von Amdahl ein. Das hat mit dem Aspekt zu tun, dass die meisten Anwendungen nicht vollständig parallelisiert werden können bzw. sollen. Daher ist die Temposteigerung von seriellen Programmen, die parallelisiert werden, meist nicht optimal. Und das bedeutet laut Amdahl, dass der sequenzielle Teil einer Anwendung maßgeblich für die Temposteigerung zuständig ist.

Eine weitere Einschränkung bei der Geschwindigkeitssteigerung sind limitierende Faktoren wie das Erzeugen und Zerstören von Threads, Cache-Synchronisierungen und so fort. Die Erzeugung eines Threads dauert zum Beispiel so lang wie die Addition von 1.000 Integer-Zahlen. Abhilfe schaffen Threadpools, mit deren Hilfe ein Thread einmal erzeugt wird und dann immer wieder zur Verfügung steht. Wichtig ist aber auch die Granularität der Threads, damit die vorhandenen Ressourcen optimal genutzt werden.

Fazit: Es gibt je nach Rechendauer und -aufwand einen optimalen Parallelisierungsgrad. Und Threadpools helfen, parallelisierte Anwendungen zu beschleunigen.


Share/Bookmark
Kategorien : Multicore Tags : , ,

Kommentare

Keine Kommentare vorhanden.


Beitrag kommentieren.

Sie müssen angemeldet sein um diesen Beitrag zu kommentieren. [Login | Registrieren]

(erforderlich)

(erforderlich)