1 / 49

Parallel Extensions for the .NET Framework

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?

iola
Download Presentation

Parallel Extensions for the .NET Framework

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Parallel Extensions for the .NET Framework Bernd Marquardt Software+Consulting

  2. 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

  3. Agenda • Environment-Variablen • Die Klasse Task • Die Klasse Future • ConcurrentExceptions • Synchronisierung • Zusammenfassung

  4. 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!

  5. Einführung Intel Clock Speed Quelle: Intel, Wikipedia

  6. 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

  7. 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“

  8. 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

  9. 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)

  10. 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

  11. Einführung • ACHTUNG: • Normale Multithread-Programmierung ist NICHT einfach! • Höherer Aufwand • Debugging • Fehlersuche • Testing • Synchronisierung • Planung

  12. 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

  13. 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

  14. Installation • Nur mit Visual Studio 2008 • .NET Framework 3.5 • Betriebssystem: • Windows Server 2003 • Windows XP • Windows Vista • Windows 7

  15. 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

  16. Demo 3 demo

  17. 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

  18. Demo 4, Demo 5, Demo 6 demo

  19. Schleifen parallelisieren • Achtung: Was passiert mit sogenannten unausgewogenen“ Schleifen? • Beispiel: for(int i = 0; i < 1000; i++) { if(i < 500) { DoLongCalculation(); } else { DoShortCalculation(); } }

  20. 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

  21. 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); }

  22. 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!!!)

  23. Aggregationen intiSum = 0; Parallel.For(0, 1000, // From, To () => 0, // Init (i, state) => { // Loop body state.ThreadLocalState += i; }, (partSum) => { // Aggregation Interlocked.Add(refiSum, partSum); });

  24. Agg 1, Agg 2 demo

  25. 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

  26. Demo 7, Demo 8 demo

  27. 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!

  28. Beispiele und Performance • Innere und äußere Schleife • Schleifendurchläufe mit stark unterschiedlicher Dauer • Matrixmultiplikation • Primzahlen berechnen

  29. InnerOuter, MatMult, PrimesStd, PrimesPar demo

  30. 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

  31. 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…

  32. 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 { … });

  33. Die Klasse Task • Wichtige Features: • Synchronisierung von parallelen Ausführungseinheiten • Abbrechen von Ausführungseinheiten • Benutzung wie normale Threads • Synchronisierung, Abbruch,…

  34. Demo 10, Demo 12 demo

  35. 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?

  36. Demo 13, Demo 14, FutureWinForms, …WPF demo

  37. 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

  38. 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!

  39. 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)

  40. ConcurrentExceptions • Welche Klassen werfen AggregateException-Objekte? • Die Parallel-Klasse • Die Task-Klasse • Die Future-Klasse • Parallel LINQ (Abfragen)

  41. Demo 15 demo

  42. Synchronisierung • Barrier • CountDownEvent • LazyInit<T> • ManualResetEventSlim • SemaphoreSlim • SpinLock • SpinWait • WriteOnce<T> • Collections

  43. 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

  44. 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

  45. 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

  46. 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

  47. Save the date for tech·days nextyear! 7. – 8. April 2010Congress Center Basel

  48. Premium Sponsoring Partners Classic Sponsoring Partners Media Partner

More Related