aktualisiert erreiche ich jetzt besser als 1.7x Speedup auf einer Dual-Core-Maschine.
Ich dachte, ich würde versuchen, einen parallelen Sortierer zu schreiben, der in .NET 2.0 arbeitete (ich denke, überprüfen Sie mich dazu), und das nichts anderes als die ThreadPool
verwendet.
Hier sind die Ergebnisse eines 2.000.000 Elementanordnung Sortierung:
Time Parallel Time Sequential
------------- ---------------
2854 ms 5052 ms
2846 ms 4947 ms
2794 ms 4940 ms
... ...
2815 ms 4894 ms
2981 ms 4991 ms
2832 ms 5053 ms
Avg: 2818 ms Avg: 4969 ms
Std: 66 ms Std: 65 ms
Spd: 1.76x
ich einen 1.76x Speedup bekam - ziemlich nah an der optimalen 2x ich hatte gehofft, dass - in diesem Umfeld:
- 2.000.000 zufällig
Model
Objekte
- Sortieren von Objekten durch einen Vergleichsdelegaten, der zwei
DateTime
Eigenschaften vergleicht.
- Mono JIT-Compiler Version 2.4.2.3
- Max OS X 10.5.8 auf 2,4 GHz Intel Core 2 Duo
Dieses Mal habe ich Ben Watson's QuickSort in C# verwendet.Ich änderte seine QuickSort
innere Schleife aus:
QuickSortSequential:
QuickSortSequential (beg, l - 1);
QuickSortSequential (l + 1, end);
zu:
QuickSortParallel:
ManualResetEvent fin2 = new ManualResetEvent (false);
ThreadPool.QueueUserWorkItem (delegate {
QuickSortParallel (l + 1, end);
fin2.Set();
});
QuickSortParallel (beg, l - 1);
fin2.WaitOne (1000000);
fin2.Close();
(. Eigentlich in dem Code, den ich ein wenig zu Load-Balancing, die zu helfen scheinen)
Ich habe Es wurde festgestellt, dass sich die Ausführung dieser parallelen Version nur auszahlt, wenn sich mehr als 25.000 Elemente in einem Array befinden (obwohl ein Minimum von 50.000 den Prozessor wahrscheinlich mehr atmen lässt).
Ich habe so viele Verbesserungen vorgenommen, wie ich an meine kleine Dual-Core-Maschine denken kann. Ich würde gerne einige Ideen auf 8-Wege-Monster ausprobieren. Auch diese Arbeit wurde auf einem kleinen 13 "MacBook mit Mono ausgeführt. Ich bin gespannt, wie andere auf einer normalen .NET 2.0-Installation abschneiden.
Der Quellcode in all seiner hässlichen Pracht ist hier erhältlich: http://www.praeclarum.org/so/psort.cs.txt. Ich kann reinigen sie es, wenn es irgendein Interesse ist.
Wenn Die Sortierung sollte stabil sein (gleiche Elemente behalten ihre ursprüngliche Reihenfolge bei), oder wenn die Vergleiche teuer sind (weniger Vergleiche), ist der Algorithmus [mergesort] (http://www.martinstoeckli.ch/csharp/parallel_mergesort.html) ein guter Alternative zu Quicksort. – martinstoeckli