490 likes | 604 Views
Parallel Extensions for the .NET Framework. Bernd Marquardt Software+Consulting. Agenda. Einführung Download, Voraussetzungen, Installation Parallelerweiterungen für das Framework Schleifen parallelisieren Codeblöcke parallelisieren Tipps und Tricks Was geht und was geht nicht?
E N D
Parallel Extensions for the .NET Framework Bernd Marquardt Software+Consulting
Agenda • Einführung • Download, Voraussetzungen, Installation • Parallelerweiterungen für das Framework • Schleifen parallelisieren • Codeblöcke parallelisieren • Tipps und Tricks • Was geht und was geht nicht? • Beispiele und Performance
Agenda • Environment-Variablen • Die Klasse Task • Die Klasse Future • ConcurrentExceptions • Synchronisierung • Zusammenfassung
Einführung • Bisher: • Alle 2-3 Jahre wurden die CPU‘s doppelt so schnell • Davon haben unsere Programme automatisch etwas • Deutlich sichtbar bei mathematischen Berechnungen, weniger sichtbar bei UI-Angelegenheiten • Performance-optimiertes Programmieren wird in Zukunft immer wichtiger werden!
Einführung Intel Clock Speed Quelle: Intel, Wikipedia
Einführung • Prozessor-Takt bleibt bei 3 – 4 GHz stehen • Mehr geht nicht: Kühlung wird schwierig • Eigentlich müssten unsere CPU‘s jetzt ca. 50 GHz können • Anzahl der Transistoren auf einem Chip steigt aber weiter an • Resultat: Multi-Core CPU‘s kommen immer stärker • Mehrere CPU‘s auf einem Chip
Einführung • Programmierung für Multi-Core CPU‘s • Multi-Processing (gibt uns das Betriebssystem) • Multi-Threading (müssen wir im Moment noch selbst programmieren) • Wir müssen unsere Programme anpassen, sonst haben wir nichts von den Multi-Core- CPU‘s • Performance- und Parallel-Überlegungen „kommen also jetzt in Mode“
Einführung • Aber Achtung: • Bei mehreren PROZESSEN haben wir automatisch etwas von den Mehrkernprozessoren • Wenn wir in EINER ANWENDUNG alle Kerne ausnutzen wollen, müssen wir etwas dafür programmieren
Einführung • Möglichkeiten und Anwendungsbereiche der Multithreading-Technologie: • Verkürzung der Antwortzeiten einer Anwendung • Erhöhung des Durchsatzes einer Anwendung • …das geht auch auf Single-Core-Systemen • Erhöhung der Performance der Berechnungen in einer Anwendung • …das geht nur durch Parallelprogrammierung auf Multi-Core-Systemen • (mit einigen kleinen Ausnahmen)
Einführung • Andere Parallelisierungs-Technologien: • Multithreading, Threadpool • Managed und unmanaged Code • OpenMP (C, C++, FORTRAN) • Managed und unmanaged Code • MPI und MPI.NET (Message Passing Interface) (C, C++, FORTRAN, .NET) • NEU: Parallel Extensionsfor .NET • Task Parallel Library (TPL) • Eine Erweiterung für .NET-Sprachen • Nur managed Code
Einführung • ACHTUNG: • Normale Multithread-Programmierung ist NICHT einfach! • Höherer Aufwand • Debugging • Fehlersuche • Testing • Synchronisierung • Planung
Download • Download CTP unter: • http://www.microsoft.com/downloads/details.aspx?FamilyId=348F73FD-593D-4B3C-B055-694C50D2B0F3&displaylang=en • Google-Suche: • Task Parallel Library Download • Visual Studio 2010 beta
Voraussetzungen • Ideal ist ein Rechner mit mehreren Prozessoren • Gut zum Testen (mit und ohne Parallelisierung) • Geschwindigkeit (Taktfrequenz) spielt beim Testen eher eine untergeordnete Rolle • Normal RAM (VS 2008) • Ein bisschen Festplatte
Installation • Nur mit Visual Studio 2008 • .NET Framework 3.5 • Betriebssystem: • Windows Server 2003 • Windows XP • Windows Vista • Windows 7
Parallelerweiterungen für Linq • Es gibt zwei Möglichkeiten: • System.Linq.ParallelEnumerable-Klasse • AsParallel-Erweiterungsmethode • Ziel: Parallele Datenabfragen mit LINQ • Sehr einfach • WAS-Programmierung statt WIE-Programmierung • Hinweis: Referenz auf System.Threading.Dll einfügen
Demo 3 demo
Schleifen parallelisieren • Wichtige Klasse: • System.Threading.Parallel • Schleifen werden aufgeteilt auf mehrere Threads • Das geht nur, wenn die einzelnen Schleifendurchläufe unabhängig voneinander sind • Problem z.B.: a[i] = a[i – 1] * 2 • Indices in der Schleife müssen „gleich“ sein • Parallel.For und Parallel.ForEach
Schleifen parallelisieren • Achtung: Was passiert mit sogenannten unausgewogenen“ Schleifen? • Beispiel: for(int i = 0; i < 1000; i++) { if(i < 500) { DoLongCalculation(); } else { DoShortCalculation(); } }
Schleifen parallelisieren • Schleifen werden nicht einfach „halbiert“ • Es werden „kleine Bröckchen“ gemacht • Sobald ein Thread fertig ist, bekommt er den nächsten Happen, bis die Arbeit komplett erledigt ist
Aggregationen • Zusammenfassen von Ergebnissen • Achtung: Meistens ist Locking erforderlich • Typischer Anwendungsfall: double dSum = 0.0; for(int i = 0; i < 1000; i++) { dSum += Math.Sqrt(i); }
Aggregationen • Zwischenwerte werden über sog. ThreadLocalState weitergegeben • Ablauf: • Vor der Schleifenabarbeitung: LocalState initialisieren • Schleife abarbeiten: Im Thread rechnen, LocalState benutzen • Nach der Schleifenabarbeitung: Aggregation (Zusammenfassung) der Ergebnisse (Achtung: Locking!!!)
Aggregationen intiSum = 0; Parallel.For(0, 1000, // From, To () => 0, // Init (i, state) => { // Loop body state.ThreadLocalState += i; }, (partSum) => { // Aggregation Interlocked.Add(refiSum, partSum); });
Agg 1, Agg 2 demo
Codeblöcke parallelisieren • Unabhängiger Code kann parallel ausgeführt werden • Häufigstes Problem: Gleichzeitiger Zugriff auf die gleichen Daten (schreibend) • Ohne Nachdenken geht da gar nichts! • Wichtige Methode: Parallel.Invoke
Demo 7, Demo 8 demo
Tipps und Tricks • Parallel.For und Parallel.ForEach: • (Anzahl der Durchläufe * Dauer) muss groß genug sein • Normalerweise sollte man die äußere Schleife parallelisieren • Nicht zu viele Tasks erzeugen • Möglichst wenig Synchronisierung verwenden • Nicht vergessen: Amdahl‘s Gesetz!
Beispiele und Performance • Innere und äußere Schleife • Schleifendurchläufe mit stark unterschiedlicher Dauer • Matrixmultiplikation • Primzahlen berechnen
Performance MatMult • Größe Sequentiell Parallel • 5 0.0017 0.0223 ms • 10 0.0111 0.0254 ms • 25 0.1687 0.1830 ms • 50 1.3953 1.2970 ms • 100 11.207 9.300 ms • 250 185.41 94.81 ms • 500 1950.8 978.0 ms
Environment-Variablen • PLINQ_DOP • DOP = degreeofparallelism • PLINQ_DOP = 1 • Ein Thread wird benutzt • PLINQ_DOP = 8 • Acht Threads werden benutzt • Wenn PLINQ_DOP > Prozessoren * Kerne, dann gibt es mehr Threads, als gleichzeitig benutzt werden können • Vorteil: Wenn ein laufender Thread in den Wartezustand geht, kann ein anderer laufen…
Die Klasse Task • Die Task-Klasse wird benötigt, um erweiterte Parallelisierungprobleme zu lösen • Vergleichbar mit der ThreadPool-Klasse: • …ist ähnlich wie: ThreadPool.QueueUserWorkItem(delegate { … }); Task.Create(delegate { … });
Die Klasse Task • Wichtige Features: • Synchronisierung von parallelen Ausführungseinheiten • Abbrechen von Ausführungseinheiten • Benutzung wie normale Threads • Synchronisierung, Abbruch,…
Demo 10, Demo 12 demo
Die Klasse Future • Die Future-Klasse ist abgeleitet von der Task-Klasse • Sie ermöglicht die asynchrone Berechnung von Daten • Wenn später dann die berechneten Daten weiter benutzt werden sollen, wird geprüft, ob die Berechnung bereits abgeschlossen ist • Sonst wird gewartet…. = Synchronisierung • Kann man Future-Variablen in Anwendungen mit einer Benutzerschnittstelle benutzen?
ConcurrentExceptions • In normalen, sequentiellen Anwendungen kann zu einer bestimmten Zeit maximal EINE Exception geworfen werden • Bei parallelen Anwendungen können auch mehrere Exceptions geworfen werden • Oft werden die Exceptions dann auch noch in einem anderen Thread verarbeitet, als in dem Thread, in dem sie geworfen wurden
ConcurrentExceptions • Paralleler Code – Problem: • Reihenfolge, mehrere Exceptions!! • Darum gibt es einen anderen Exception-Mechanismus in den Parallel Extensions • Wenn eine Exception im Parallel-Code auftritt, werden alle Threads - so schnell wie möglich - angehalten • Achtung: In dieser Zeit können eventuell noch weitere Exceptions auftreten!
ConcurrentExceptions • Alle aufgetretenen Exceptions werden in einem Objekt der Klasse System.Threading.AggregateExceptioneingesammelt • Wenn alle Threads angehalten sind, dann wird die AggregateException neu geworfen und kann bearbeitet werden • Die einzelnen Exceptions können über das Property InnerExceptions abgefragt werden (eine Collection der aufgetretenen Exceptions)
ConcurrentExceptions • Welche Klassen werfen AggregateException-Objekte? • Die Parallel-Klasse • Die Task-Klasse • Die Future-Klasse • Parallel LINQ (Abfragen)
Demo 15 demo
Synchronisierung • Barrier • CountDownEvent • LazyInit<T> • ManualResetEventSlim • SemaphoreSlim • SpinLock • SpinWait • WriteOnce<T> • Collections
Zusammenfassung • Es gibt neue Möglichkeiten, um Code zu parallelisieren • Wir müssen keine Threads mehr explizit erzeugen • Schleifen sind einfach zu parallelsieren • Code ist besser zu lesen, als mit einzelnen Threads • Auch Codeblöcke kann man einfach paralellisieren
Zusammenfassung • Trotzdem gibt es Fälle, bei denen eine Parallelisierung nichts bringt • Testen, Prototyp erstellen • Ggf. seriellen Code verwenden • Die Klassen Task und Future ermöglichen die präzisere Steuerung des parallelen Codes • Parallel Linq bietet einfachere Möglichkeiten der parallelen Programmierung, als die bisherige Anwendung von normalen Threads
Your MSDN resourcescheck out these websites, blogs & more! PresentationsTechDays: www.techdays.chMSDN Events: http://www.microsoft.com/switzerland/msdn/de/presentationfinder.mspxMSDN Webcasts: http://www.microsoft.com/switzerland/msdn/de/finder/default.mspx MSDN EventsMSDN Events: http://www.microsoft.com/switzerland/msdn/de/events/default.mspxSave the date: Tech•Ed 2009 Europe, 9-13 November 2009, Berlin MSDN Flash (our by weekly newsletter)Subscribe: http://www.microsoft.com/switzerland/msdn/de/flash.mspx MSDN Team BlogRSS: http://blogs.msdn.com/swiss_dpe_team/Default.aspx Developer User Groups & CommunitiesMobile Devices: http://www.pocketpc.ch/Microsoft Solutions User Group Switzerland: www.msugs.ch.NET Managed User Group of Switzerland: www.dotmugs.chFoxPro User Group Switzerland: www.fugs.ch
Your TechNet resourcescheck out these websites, blogs & more! PresentationsTechDays: www.techdays.ch TechNet EventsTechNet Events: http://technet.microsoft.com/de-ch/bb291010.aspx Save the date: Tech•Ed 2009 Europe, 9-13 November 2009, Berlin TechNet Flash (our by weekly newsletter)Subscribe: http://technet.microsoft.com/de-ch/bb898852.aspx Schweizer IT Professional und TechNet BlogRSS: http://blogs.technet.com/chitpro-de/ IT Professional User Groups & CommunitiesSwissITPro User Group: www.swissitpro.chNT Anwendergruppe Schweiz: www.nt-ag.chPASS (Professional Association for SQL Server): www.sqlpass.ch
Save the date for tech·days nextyear! 7. – 8. April 2010Congress Center Basel
Premium Sponsoring Partners Classic Sponsoring Partners Media Partner