.NET -Programme beschleunigen
Während bei Singlecore-Architekturen ein zweiter Thread vor allem dazu dient, die Reaktionsfähigkeit der Benutzeroberfläche zu erhalten, steht bei der echten Parallelisierung die Laufzeitverbesserung im Vordergrund. Das .NET Framework 4 mit der Task Parallel Library greift Ihnen dabei unter die Arme.

Wir zeigen Ihnen hier Parallelisierung, die dann Vorteile bringt, wenn dem Programm mehrere Prozessorkerne zur Verfügung stehen. Zum Parallelisieren sollten Sie vor allem solche Codeteile auswählen, die ausreichend zeitintensiv, threadsicher und falls überhaupt, mit geringem Aufwand zu synchro...
Wir zeigen Ihnen hier Parallelisierung, die dann Vorteile bringt, wenn dem Programm mehrere Prozessorkerne zur Verfügung stehen.
Zum Parallelisieren sollten Sie vor allem solche Codeteile auswählen, die ausreichend zeitintensiv, threadsicher und falls überhaupt, mit geringem Aufwand zu synchronisieren sind.
Code, der auch bei sequenzieller Ausführung in kürzester Zeit ausgeführt wird, ist für die Parallelisierung eher ungeeignet, da damit zu rechnen ist, dass der mit der Parallelisierung einhergehende Overhead den angestrebten Laufzeitgewinn zunichte macht.

Threadsicher bedeutet, dass der parallelisierte Code auch dann korrekte Ergebnisse liefert, wenn er von mehreren Threads gleichzeitig ausgeführt wird. Zugriffe auf Ressourcen, wie z.B. einen Datei-Stream, oder auf nicht lokale Daten, wie z.B. globale und statische Variablen, bergen die Gefahr, dass es zu Fehlern bzw. zu Datenkorruption kommt, wenn sie von mehreren Threads gleichzeitig genutzt werden.
Zu berücksichtigen ist auch, dass jede Synchronisierung Laufzeit kostet. Außerdem bergen komplexe Synchronisierungen die Gefahr, dass Situationen entstehen - so genannte Deadlocks -, in denen Threads sich gegenseitig blockieren. Daher sollten Sie für die Parallelisierung vor allem Codeteile heranziehen, die ohne Synchronisierung parallel ausgeführt werden können.
Wir beginnen zur Demonstration ganz von vorne, nämlich bei einem nicht parallelisierten Programm. Es berechnet vier verschiedene Ausschnitte aus einem Fraktal, das mittels eines Algorithmus erzeugt wird, das an der Definition der Julia-Menge angelehnt ist (de.wikipedia.org/wiki/Julia-Menge ).
Beim Drücken der Berechnen-Schaltfläche werden die Ausschnitte nacheinander berechnet und in die vier Panel-Felder eingezeichnet. Die Schaltflächen werden während der Berechnung deaktiviert und nach Abschluss der Berechnung wieder freigegeben. Dies zeigt dem Benutzer an, dass er auf das Ergebnis warten muss. Die Benutzeroberfläche reagiert während der Berechnung nicht. Hier der Code für das Click-Ereignis der Berechnen-Schaltfläche:
System::Void button1_
Click(System::Object^ sender, System::EventArgs^ e)
{ button1->Enabled = false;
button2->Enabled = false;
// Leinwände löschen
panel1->Refresh();
panel2->Refresh();
panel3->Refresh();
panel4->Refresh();
// Berechnung starten
berechneFraktal1();
berechneFraktal2();
berechneFraktal3();
berechneFraktal4();
button1->Enabled = true;
button2->Enabled = true; }
Zunächst deaktivieren Sie die beiden Schaltflächen, indem Sie deren Enabled-Eigenschaft auf false setzen, dann löschen Sie mit der Refresh()-Methode die Leinwände der Panel-Steuerelemente und rufen anschließend die Methoden zum Berechnen und Rendern der Fraktale auf. Danach aktivieren Sie die Schaltflächen wieder.
Beachten Sie, dass in diesem und in den folgenden Beispielen die Fraktale erneut gezeichnet werden, wenn der Benutzer mehrmals auf die Berechnen-Schaltfläche klickt. Durch das Deaktivieren zeigen Sie dem Benutzer lediglich an, dass er das nicht tun soll.

Der genannte Effekt hat im Übrigen nichts mit der Parallelisierung zu tun. Um ihn zu vermeiden, müssten Sie die Anweisungen button1->Enabled = true; und button1->Enabled = true; in einer anderen Ereignismethode einrichten. Aus Gründen der Einfachheit ist dies in den Beispielen jedoch nicht geschehen.
In früheren Zeiten konnten Anwender sicher sein, dass ihre Programme nach Kauf eines schnelleren Rechners auch schneller ausgeführt wurden. Doch wenn ein Anwender jetzt seinen alten Singlecore-Rechner durch einen neuen Computer mit vier oder mehr Kernen und womöglich geringerer Taktung ersetzt, wird er bei Anwendungen, die wie das obige Beispiel aus nur einem Thread bestehen, verwundert feststellen, dass sie eher langsamer als schneller ausgeführt werden.
Tipp
Wenn Sie selbst nachverfolgen möchten, wie sich die Ausführung von Programmen auf die Prozessorauslastung auswirkt, rufen Sie den Windows Task-Manager auf (Strg+Umschalt+Esc). Auf der Registerkarte Leistung finden Sie eine Reihe von Verlaufsfenstern - eines für jeden Prozessorkern.
Klicken Sie doppelt in eines, um die Anzeige zu vergrößern und starten Sie dann das Programm. Auf einem Computer mit vier Kernen können Sie für das obige Einführungsprogramm feststellen, dass es ein Viertel der Ressourcen nutzt.