Im Juni ist ein neuer CTP von den "Microsoft Parallel Extensions to .NET Framework 3.5" erschienen. Voraussetzung für diesen CTP ist das .NET Framework 3.5. Den Download finden Sie hier.


Um was geht es hier?

Multicore-Prozessor Maschinen werden zum Standard. Bereits handelsübliche Laptops werden heute mit einem Dual-Core-Prozessor ausgeliefert. Damit aber Programme effektiv auch schneller werden, müssen sie explizit für Multicore-Prozessoren geschrieben werden. Herkömmliche Software wird meist nur auf einem Prozessor ausgeführt und läuft daher auf Multicore-Prozessor Maschinen nicht merklich schneller.

Parallel Computing ist jedoch komplex - Routinen gleichzeitig auf mehreren Prozessoren ausführen zu lassen, ist mit einigen Herausforderungen verbunden, welche von der Multithreading Programmierung her dem einen oder anderen Programmierer bekannt sind (z.B. Locks).

Der erwähnte CTP, welcher vom Microsoft .NET Team in Zusammenarbeit mit Microsoft Research entwickelt worden ist, hat zum Ziel, dass paralleles Programmieren für den Entwickler vereinfacht wird. So soll beispielsweise der Code immer gleich aussehen, egal ob er auf einem Single-Core-Prozessor oder einem Multicore-Prozessor ausgeführt wird.

Paralleles Programmieren ist natürlich vor allem bei sehr rechenintensiven Operationen interessant, wie sie beispielsweise in Grafiksoftware vorkommt. Angenommen, wir möchten zwei 5 MB Bilder aufeinanderlegen, sind dazu mindestens 5 Mio. Operationen notwendig. Die paar Sekunden, welche hier der Benutzer unter Umständen auf die Antwort warten muss, können beispielsweise auf einer Duo-Core-Prozessor Maschine potentiell halbiert werden.


Beispiel

Genau ein solches Beispielprogramm inkl. Quellcode ist Teil des CTPs:

image

Die ersten zwei Bilder wählt der Benutzer aus, das dritte ist eine Kombination aus den ersten zwei und ist mit einem gewissen Rechenaufwand verbunden. Das Test zeigt, dass auf meiner Dual-Core Prozessor Maschine im Parallelmodus die Berechnung 1.57 mal schneller ist!

Wie sieht nun der Code für die Parallelprogrammierung aus?

Für den sequentiellen Modus wird folgender Code verwendet:

image

Es gibt also zwei Schleifen, die äussere iteriert über die y-Achse (j), die innere über die x-Achse (i). Alle (Pixel-)Operationen sind unabhängig voneinander, ein Parallelisieren ist also relativ einfach möglich. Sinnvoll ist beispielsweise eine Parallelisierung pro Zeile (j-Schleife). Sofern also beispielsweise zwei Prozessoren vorhanden wären, könnte sich der erste um die Zeilen 1,3,5... kümmern, der andere um die Zeilen 2,4,6,... Diese Aufgabe kann natürlich klassisch mit Hilfe von System.Threading und zwei Threads gelöst werden.

Mit Hilfe des CTPs und den neuen Klassen, welche als Teil von System.Threading ausgeliefert werden, kann die Parallelisierung dieses Algorithmus' wie folgt programmiert werden:

image

Auf den ersten Blick ist der Code identisch, mit der Ausnahme in der Zeile 1:

Parallel.For(0, height, delegate(j)
  body
);

Parallel ist dabei nichts anderes als eine neue Klasse und bietet beispielsweise die Methode For() an. Sie stellt sicher, dass der body, welcher height Mal ausgeführt werden muss, nach Möglichkeit parallel ausgeführt wird.


Parallel LINQ

Erwähnenswert in diesem Zusammenhang ist sicherlich auch, dass LINQ-to-Objects und LINQ-to-XML sehr gute Ausgangslagen bilden, um von parallel programming zu profitieren: Parallel LINQ (PLINQ) ist nämlich auch Teil des CTPs und ermöglicht, dass LINQ queries parallel ausgeführt werden.

Beispiel:

Angenommen, wir möchten in einem Integer Array jeden Wert um 2 erhöhen, kann dies mittels LINQ-to-Objects wie folgt gelöst werden:

iArr = (from x in iArr select x + 2).ToArray();

Mit PLINQ muss das Query wie folgt angepasst werden:

iArr = (from x in iArr.AsParallel() select x + 2).ToArray();


Einschränkungen dieses CTPs

"This CTP is for testing purposes only. Features and functionality may change before final release, and Microsoft may choose not to provide a final release."


Weitere Infos

Die zentrale Parallel Computing Site von MSDN finden Sie hier: http://msdn.microsoft.com/en-us/concurrency