Wie kann ich effektiv mehrere Kerne für kurze Berechnungen in .NET nutzen?

8

Hier ist der Kontext: Ich schreibe einen Interpreter in C # für eine kleine Programmiersprache namens Heron , und es hat einige primitive Listenoperationen, die parallel ausgeführt werden können.

Eine der größten Herausforderungen für mich besteht darin, die vom Evaluator geleistete Arbeit effektiv auf die verschiedenen Kerne zu verteilen, wenn eine parallelisierbare Operation stattfindet. Dies kann eine kurze oder lange Operation sein, es ist schwierig im Voraus zu bestimmen.

Eine Sache, um die ich mir keine Sorgen machen muss, ist das Synchronisieren von Daten: Die parallelen Operationen dürfen Daten nicht explizit ändern.

Die Hauptfragen, die ich habe, sind also:

  • Was ist der effektivste Weg, um die Arbeit über Threads zu verteilen, so dass ich garantieren kann, dass der Computer die Arbeit über zwei Kerne verteilt?

Ich bin auch an einer verwandten Frage interessiert:

  • Ungefähr wie lange sollte eine Operation dauern, bis wir anfangen können, den Overhead der Trennung der Arbeit auf einen anderen Thread zu überwinden?
cdiggins 07.02.2010, 04:19
quelle

3 Antworten

15

Wenn Sie viel mit parallelen Operationen machen wollen, sollten Sie mit .Net 4.0 beginnen. Hier ist die parallele Programmierung für .Net-Dokumentation . Sie sollten hier starten . .Net 4.0 fügt eine Menge in Bezug auf Multi-Core-Nutzung hinzu. Hier ist ein kurzes Beispiel:

Aktuell 3.5 Serielle Methode:

%Vor%

New .Net 4.0 Parallele Methode:

%Vor%

Die Parallel.For Methode skaliert automatisch über die Anzahl der verfügbaren Kerne, können Sie sehen, wie schnell Sie davon profitieren könnten. Es gibt Dutzende von neuen Bibliotheken im Framework, die volle Thread / Task-Verwaltung unterstützen, wie auch Ihr Beispiel (einschließlich aller Verrohrungen für die Synchronisierung, Löschung usw.).

Es gibt Bibliotheken für Parallel LINQ (PLINQ) , Task Factories , Task Scheduler und ein paar andere. Kurz gesagt, für die spezifische Aufgabe, die Sie angelegt haben .Net 4.0 hat große Vorteile für Sie, und ich würde gehen weiter und schnappen Sie sich die kostenlose Beta 2 ( RC bald ) und los geht's. (Nein, ich arbeite nicht für Microsoft ... aber selten sehe ich, dass eine kommende Version ein Bedürfnis so perfekt erfüllt, also empfehle ich .Net 4.0 für Sie)

    
Nick Craver 07.02.2010, 06:31
quelle
5

Weil ich nicht mit VS 2010 entwickeln wollte, und ich fand, dass ThreadPool keine optimale Leistung für die Verteilung von Arbeit über Kerne hatte (ich denke, weil es zu viele Threads gestartet / gestoppt hat) besitzen. Hoffe, dass andere das nützlich finden:

%Vor%     
cdiggins 07.02.2010 21:02
quelle
2

Ich würde mit Thread-Pool gehen, obwohl es seine Probleme hat, MS investiert in Verbesserung und es scheint, als ob .NET 4 eine verbesserte haben wird. An diesem Punkt denke ich, dass das beste Ding wäre, den Thread-Pool in Ihrem eigenen Objekt zu verwenden und mit der Entscheidung über Ihre eigene Implementierung zu warten

    
Mitzi 15.02.2010 08:20
quelle