Software Dev Blog

Mobile, Multicore, Multithreading & Visual Computing

IDF09: Parallel Computing mit .NET 4 und Visual Studio 2010

| 0 comments

Ich sitze hier in der Microsoft Techsession, die von Steve Teixeira gehalten wird. Steve spricht über Parallelprogrammierung unter .NET 4 und Visual Studio 2010. Ich kann natürlich nicht den gesamten Vortrag wiedergeben, daher konzentriere mich auf seine wesentlichen Aussagen:

Multithreaded programming is “hard” today

Das bedeutet für Microsoft (und Intel), Software-Entwicklern dabei zu helfen. Hierzu bieten beide (Intel und Microsoft) passende Tools, die Programmierer unterstützen. Dazu gehören laut Steve aber auch Programmiersprachen und Plattformen.

Ein kleines Schleifenbeispiel führt Steve vor, das zeigen soll, wie sich seriell programmierter Quellcode parallelisieren lässt – inklusive potenzieller Probleme.

Als Lösung für das Sortierproblem eignet sich laut Steve LINQ, das Teil von .NET 3.5 ist. Weitergesponnen bietet die parallele Version von LINQ = PLINQ eine viel bessere Lösung für Sortieralgorithmen – und mehr!

Die nächste Folie – und Steve hat eine Menge davon – zeigt den Aufbau von Visual Studio 2010. Dazu gehören Tools wie Parallel Debugger und Profiler Concurrency Analysis, Programmierungsmodelle wie PLIN!, Task Parallel Library (TPL) und mehr.

Ein paar Daten zu TPL: Es handelt sich dabei um eine parallel API mit speziellen Konstrukten wie parallel_for, parallel_invoke, critical_section (Synchronisation), task_group (Tasks), combinable<T> (Container) etc.

Jetzt folgt ein Beispiel für die anwesenden C++-Programmierer: Es zeigt eine Matrizenberechnung, genauer gesagt eine vektorbasierte Addition. Zuerst geht es um die serielle Implementierung der Rechenaufgabe, dann um die parallele mithilfe einer Lambda-Funktion und der parallel_for aus der TPL. Dabei muss man sich ernsthafte Gedanken um Race Conditions machen. Die Lösung des Problems: Es gibt mehrere Instanzen des Rückgabewerts, die am Ende addiert werden.

Die Asynchronous Agents Library eignet sich vor allem für das asynchrone Ausführung paralleler Quellcode-Abschnitte. Damit lassen sich parallel ablaufende Programminstanzen generieren, die nichts voneinander wissen, die damit nicht synchronisiert oder gelockt werden müssen. Das erlaubt eine sichere Implementierung der parallelisierten Anwendung.

Der Concurrency Runtime Scheduler ist ein Dieb: Tasks werden auf die Worker Threads verteilt und parallel ausgeführt. Sobald einer der Worker Threads nichts zu tun hat, “stiehlt” er eine laufende Aufgabe eines anderen Worker Threads, was zu einer besseren Auslastung der vorhandenen Prozessorkerne führt.

Jetzt ist das Aufspüren möglicher Fehler an der Reihe, die sich beim Parallelisieren von Anwendungen ergeben können. Das Beispiel, das Steve hierfür verwendet, ist eine Matrizenmultiplikation. Also nichts Spektakuläres. Hierfür steht in Visual Studio 2010 eine Art Thread Checker parat, der eine Anwendung analysiert und das Ergebnis grafisch aufbereitet. Dazu gehört die CPU-, Core- und Threads-Auslastung.

Leave a Reply