Der Trend des Megahertz-Wahns scheint derzeit ein wenig rückläufig zu sein, und stattdessen ist es schick geworden, mehrere Prozessoren in einen Rechner einzubauen. Allerdings nützen solche Multiprozessor-Systeme nur dann etwas, wenn auch die Programme dafür erstellt wurden. Wie das geht, erfahren Sie in diesem Kapitel.
26 Paralleles Rechnen
26.1 Parallelität 

Hinweis |
Das Ziel dieses Kapitels ist es nicht, Ihnen eine umfassende Einführung in die Threadprogrammierung zu bieten, sondern eher das Thema anzuschneiden. Da der Umfang des Buches schon ziemlich gewaltig ist, lässt sich einfach nicht noch ein umfangreiches Kapitel mehr hinzufügen. Sollten Sie mehr Informationen dazu benötigen, finden Sie beispielsweise in meinem Buch »Linux-UNIX-Programmierung« (3. Auflage) ein sehr umfangreiches Kapitel dazu. Da in diesem Buch die POSIX-Threads-Bibliothek behandelt wird, lässt sich das darin Beschriebene auch unter Windows verwenden. Dieses Kapitel finden Sie auf der Buch-CD. |
Die Werbung der Computerbranche versucht zurzeit kräftig, sogenannte Dual- bzw. Quad-Core-PCs an den Mann (oder die Frau) zu bringen. Mittlerweile ist schon in jedem Discounter-PC ein solcher Prozessor eingebaut. Dabei wird einem versprochen, dass man mit zwei Prozessoren die doppelte Rechenleistung erhält, weil ja die Rechenaufgaben auf zwei Prozessoren aufgeteilt werden.
Zwei Prozessoren bringen also die doppelte Leistung? Nein, hier hat man die Rechnung ohne den Wirt gemacht. Zunächst machen solche Multiprozessorsysteme so viel Sinn, wie wenn man zwei Autos in der Garage stehen hat – man kann auch nur eines gleichzeitig fahren. Um also beide oder gegebenenfalls mehrere Prozessoren zu verwenden, muss auch die Software dafür geschrieben sein.
Auch wenn die Software für Multi-Prozessorsysteme angepasst wurde, kann man noch lange nicht sagen, um welchen Faktor (auch Speedup genannt) die Software schneller läuft. Es gibt mehrere Faktoren, von denen es abhängt, um wie viel das Programm letztendlich schneller läuft: Kann beispielsweise der Prozessor die Daten aus seinem eigenen schnellen Cache holen, oder müssen diese immer aus dem langsamen Arbeitsspeicher geholt werden? Dies hängt von der Cache-Größe des Prozessors ab. Hinzu kommen auch Größe, Topologie und Bandbreite des Speichers. Es gibt auch Situationen, in denen man mit der seriellen Programmierung genauso gute Ergebnisse erzielen kann wie mit der parallelen. Zusammengefasst lässt sich sagen, dass man den gewonnenen Geschwindigkeitsfaktor der Software erst im laufenden Betrieb ermitteln kann.
Fakt ist auf jeden Fall, dass sich die Multiprozessorsysteme künftig auch auf gewöhnlichen Workstation-Rechnern verbreiten werden. Ein guter Grund also, sich mit der Entwicklung paralleler Software zu befassen.
Hinweis |
Im nächsten C-Standard (derzeit auch als C1x-Standard bekannt), an dem das Standardisierungskomitee seit 2007 arbeitet, wird auf jeden Fall die Threadprogrammierung implementiert sein. |
26.1.1 Single-Prozessorsysteme 

Damit Programme tatsächlich parallel laufen, müssen mehrere Prozessoren vorhanden sein. Trotzdem ist es auch möglich, dass Single-Prozessorsysteme von der parallelen Programmierung profitieren. So teilen sich bei einer parallelen Anwendung beispielsweise alle einzelnen Threads das Codesegment, das Datensegment, den Heap und alle anderen Zustandsdaten, die ein gewöhnlicher Prozess besitzt. Somit sind mehrere Threads leichtgewichtiger als mehrere Prozesse.
Hinweis |
Auch wenn jemand Ihr Programm verwendet, das Sie eigentlich für Multiprozessorsysteme erstellt haben, lässt es sich ebenfalls problemlos auf einem Single-Prozessorsystem ausführen. |
26.1.2 Hyperthreading 

Hyperthreading wird häufig mit Multithreading in einen Topf geworfen. Nun hat Hyperthreading aber zunächst nichts mit zwei Prozessoren zu tun und wird trotzdem bei der Entwicklung von Multithreading-Anwendungen verwendet. Die Technologie Hyperthreading wurde von Intel mit den Prozessoren Pentium III, Pentium 4 und Xeon eingeführt, aber auch AMD hat entsprechende Prozessoren auf dem Markt. Mit dieser Technologie wird der Durchsatz von Multithreaded-Anwendungen im Multitasking erhöht, indem sie die Auslastung der On-Chip-Ressourcen erhöht, die in der Intel-NetBurst-Mikroarchitektur verfügbar sind. Ein typischer Thread belastet nur etwa 35 % der NetBurst-Ausführungsressourcen. Hyperthreading erhöht die Auslastung durch notwendige Logik und Ressourcen, die der CPU hinzugefügt werden. Für die Aufteilung der einkommenden Daten auf den freien Raum sorgen somit zwei logische Prozessoren, die vom Betriebssystem mittels klassischer Multiprocessing-Verfahren verwaltet werden.
NetBurst |
Die NetBurst-Architektur ist eine von Intel für den Pentium 4 neu entwickelte Mikroarchitektur, die bei mehreren CPU-Familien zum Einsatz kam. Die Architektur setzt auf eine sehr lange Pipeline, durch die sehr hohe Taktraten erreicht werden sollen. |
Ich will hier nicht mit dem Fachchinesisch weitermachen – es lässt sich auch einfacher erklären. Mit Hyperthreading wird dem Betriebssystem ein zweiter logischer Prozessor vorgegaukelt. Dazu wird intern einfach das Register der CPU verdoppelt und es werden zwei getrennte Recorder- und Store-Buffer eingebaut. Allerdings teilen sich die beiden virtuellen Prozessoren die Funktionseinheiten, sodass es rein logisch nicht möglich ist, dass Befehle zweier Threads gleichzeitig ausgeführt werden. Aber in der Praxis stellte sich heraus, dass diese Technik manchmal genauso effektiv ist, als befänden sich zwei physikalische Prozessoren im System. Daher werden in der Praxis auch Prozessoren, die Hyperthreading implementiert haben, als parallele Systeme anerkannt.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.