Vorheriger Beitrag: Nach der Konferenz ist vor der Konferenz
prio.powerday: Multicore-Programmierung unter .NET
Kaum dass ich aus Salzburg zurück bin, sitze ich hier im Konferenzhaus in der Lazarettstraße, München, und nehme an der Multicore-Konferenz für .NET-Entwickler teil, die im Rahmen der prio.powerdays stattfindet.
Den Anfang macht Rami Radi von Intel, der die Einführungsrede hält und die Anwesenden auf das Thema Multicore einstimmen will.
Rami beginnt seinen Vortrag mit Hardware, nicht mehr Software. Namentlich spricht er über den Core i7-Prozessor, der ja im höchsten Maße multithreading-tauglich ist. Core i7 verarbeitet nämlich pro Prozessorkern zwei Threads simultan.
Die nächste Folie zeigt die ganze Vielfalt der Intel-Entwicklertools, über die ich hier schon ausführlich berichtet habe, also über Compiler, VTune etc.
So, jetzt wird’s ernst. Rami spricht über die Parallelprogrammierung im .NET-Umfeld, was seiner Meinung nach nicht einfach ist (wären wir sonst hier?). Zu den Herausforderungen gehören unter anderem falsch genutzter Speicher, zu viele und zu wenige Threads, gemeinsam genutzte Speicherbereiche, Load Balancing und viele andere. Wie gut, dass es für diese “Issues” die passenden Tools gibt wie den VTune Performance Analyzer.
Aber es gibt laut Rami auch genug Fälle, in denen parallelisierte Anwendungen langsamer laufen als serielle. Das hat diverse Gründe: Der serielle Code nimmt immer noch zu viel Raum ein, die kritischen Pfade sind nicht vernünftig parallelisiert oder die Speicherbandbreite reicht nicht aus.
Die nächste Folie zum Thema .NET-Konstrukte wirkt auf den ersten Blick ein wenig überfrachtet. Zum Glück will sich Rami auf die wirklich wichtigen Aspekte konzentrieren. Dazu gehören Thread-Pools. Rami zeigt ein kleines Beispiel anhand einer kleinen Fotoverwaltung, die in C# geschrieben ist.
Der Vorteil von Thread-Pools ist in diesem Fall, dass nicht ein, sondern zwei oder mehr Bilder gleichzeitig aus der SQL-Datenbank ausgelesen werden können, die die Bilder aufbewahrt. Der Trick hierbei ist übrigens, die Thread-Parameter in die For-Schleife zu packen. Außerdem muss ein Wait-Signal eingebaut werden, damit die Anwendung am Ende weiß, dass alle Bilder angezeigt worden sind. Darüber hinaus ist ein Lock-Befehl einzufügen, der die SQL-Zugriffe synchronisiert.
Interessant: Innerhalb des .NET-Umfelds kann nativer Code eingesetzt werden, um leistungsfähige Bibliotheken zu nutzen.
Jetzt gibt’s noch ein paar nützliche Tipps, mit denen man multithread-optimierten Code noch besser machen kann. Dazu gehören das Auslesen der vorhandenen Prozessorressourcen, das Zusammenfassen mehrerer Funktionen zu einem einzigen Thread, das Cachen von häufig benutzen Daten und das Benutzen von parallelen Datenbankverbindungen.
Schließlich gibt es noch eine kleine Einführung in VTune, mit dem sich Anwendungen prima analysieren lassen.


Kommentare
Keine Kommentare vorhanden.