Multithreading Ausblick - "What comes after the free lunch?"
Microsoft .NET 4 und Sprachunterstützung für parallele Verarbeitung
Die Anforderungen an die Softwarearchitektur Mehrprozessorsysteme zu unterstützen rückt immer stärker in den Vordergrund. Das gilt umso mehr für Anwendungen welche die Simulation von virtuellen Welten umsetzen. Eine optimale Auslastung der Prozessorhardware muss gewährleistet sein, möchte man den die vielfältigen Aufgaben wie 3D Grafik, physikalische Simulation, Kollisionsdetektion und Künstliche Intelligenz in einer Anwendung miteinander vereinen.
Noch ist die Entwicklung von Algorithmen für Mehrprozessorarchitekturen kompliziert. Die Softwareentwicklung nebenläufiger Systeme verlangt tiefgehende Kenntnisse der jeweiligen Rechnerarchitektur und Threading Idiome. Um dies zu vereinfachen entstehen zurzeit neue Werkzeuge und Spracherweiterungen im Microsoft .NET Umfeld. Dazu gehören die Task Parallel Library (TPL) Bibliothek, PLINQ und Concurrency and Coordination Runtime.
Task Parallel Library (TPL)
Die Task Parallel Library (TPL) soll die Entwicklung für Mehrkernprozessoren unter .NET Framework erleichtern und beschleunigen. Intelligente neue Code-Kontrollstrukturen (wie z.B. Parallel.For), sollen automatisch Mehrkernprozessoren ausnutzen, d.h. der Code passt sich zur Ausführungszeit an die ausführende Umgebung an.
Beispiel für das klassische For Schleifenkonstrukt:
for (int i = 0; i < 100; i++) {
a[i] = a[i]*a[i];
}
Beispiel für das neue parallele Schleifenkonstrukt Parallel.For:
Parallel.For(0, 100,
delegate(int i) {
a[i] = a[i]*a[i];
}
);
Das Parallel.For kann genutzt werden um Aufgaben zu parallelisieren. Im vorliegenden Beispiel sollen alle Zahlen des Arrays quadriert werden. Dazu wird die Berechnung für das Parallel.For in eine Delegate Instanz verschoben, welches mittels einer anonymen Klasse erzeugt wird und die Ausführung der Berechnung übernimmt.
Das .NET Framework ist dann zur Ausführungszeit dafür zuständig die optimale Verteilung einer Parallel.For Iteration auf die Prozessorhardware vorzunehmen. Diese können dann parallel auf mehreren Prozessoren ausgeführt werden. Auf einer Single Prozessor Maschine wird das Programm sequentiell ausgeführt.
PLINQ – Parallel Language Integrated Query
Die Language Integrated Query (LINQ) erlaubt es Mengenoperationen auf Datenkollektionen (u.a. Liste, Queue). Die parallele Variante PLINQ – Parallel Language Integrated Query unterstützt die nebenläufige Verarbeitung der Daten. Bei Bedarf können die Vorteile der Mehrprozessorhardware genutzt werden und die Ausführung der Mengenoperation auf mehrere Prozessoren verteilt werden.
Beispiel für einen LINQ basierten Zugriff auf eine Liste:
var query = from c in Customers where c.Name = “Smith”
select c;
Beispiel für einen PLINQ basierten Zugriff auf eine Liste:
var query = from c in Customers.AsParallel()
where c.Name = “Smith”
select c;
Concurrency and Coordination Runtime (CCR)
Mit der Concurrency and Coordination Runtime (CCR) bietet Mircosoft eine weitere .NET Programmbibliothek für die asynchrone und nebenläufige Programmierung an. In CCR wird mit Hilfe asynchroner Methoden und einem Nachrichten basierten System Nebenläufigkeit implementiert. Dabei werden technische Details wie die Wahl des Threadmodells oder die Anzahl der Threads vor dem Entwickler verborgen. Die Arbeitspakete werden in Warteschlangen sogenannten »Ports« abgelegt. Diese werden dann von »Arbiter« Komponenten verarbeitet.
Ausblick für Systemarchitektur des Grafik-Engine Frameworks
Herb Sutter schrieb in seinem Artikel “The free lunch is over”:
"The biggest sea change in software development since the OO revolution is knocking at the door, and its name is Concurrency.”(The Free Lunch Is Over, A Fundamental Turn Toward Concurrency in Software, 2005)
Diese Erwartungshaltung kann als neue Anforderung an die Framework-Architektur formuliert werden. Das INSPIRE-XNA Framework soll in Zukunft verschiedene Mechanismen und Verfahrensweisen der künstlichen Intelligenz unterstützen, z.B. Optimierung auf Basis von evolutionären Methoden, Pfadsuche und andere Algorithmen der Künstlichen Intelligenz (engl. Artifical Intelligence) sollen implementiert werden.
Viele dieser KI-Algorithmen erfordern eine Umsetzung mittels nebenläufiger Programmierung, um die Gesamtperformanz des Frameworks nicht zu stark zu beeinträchtigen. Die Umsetzung der Algorithmen mit herkömmlichen Programmierverfahren (z.B. Thread-Klassen basiert), macht die Implementierung komplex und erschwert die Wartbarkeit des Codes. Hier könnten die genannten neuen Technologien wie TPL, PLINQ und CCR zum Einsatz kommen.
Durch die Abstraktion der nebenläufigen Idiome und Lösung von technischen Details wird die Umsetzung nebenläufiger Szenarien wesentlich erleichtert und die Programmierung vereinfacht. Dies ermöglicht eine ganz neue Generation von Softwareanwendungen, welche sich an die aktuelle und zukünftige Prozessorhardware anpasst und die Hardware-Ressourcen optimal ausnutzt.
Architektur- und Entwurfsmuster werden ihren Beitrag leisten und auf abstrakter Ebene Lösungen anbieten, um die funktionalen Anforderungen an die Software zu erfüllen. Schon gibt es eine ganze Reihe neuer Pattern (z.B. „Parallel Computing Pattern“) um Lösungen für wiederkehrende Problemstellungen nebenläufiger, bzw. paralleler Systeme anzubieten.
Autor: Friedhelm Feisel
Keine Kommentare:
Kommentar veröffentlichen