actualización ahora lograr una mejor aceleración de 1,7 veces en una máquina de doble núcleo.
Pensé que intentaría escribir un clasificador paralelo que funcionara en .NET 2.0 (creo que, verifíqueme esto) y que no use nada más que el ThreadPool
.
Éstos son los resultados de la clasificación de un conjunto de elemento de 2.000.000:
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
Tengo una aceleración 1.76x - muy cerca de la óptima 2x que esperaba - en este entorno:
- 2,000,000 objetos aleatorios
Model
- Clasificación de objetos por un delegado de comparación que compara dos propiedades de
DateTime
.
- Mono versión del compilador JIT 2.4.2.3
- Max OS X 10.5.8 en 2,4 GHz Intel Core 2 Duo
Esta vez utilicé Ben Watson's QuickSort in C#.He cambiado su QuickSort
bucle interno de:
QuickSortSequential:
QuickSortSequential (beg, l - 1);
QuickSortSequential (l + 1, end);
a:
QuickSortParallel:
ManualResetEvent fin2 = new ManualResetEvent (false);
ThreadPool.QueueUserWorkItem (delegate {
QuickSortParallel (l + 1, end);
fin2.Set();
});
QuickSortParallel (beg, l - 1);
fin2.WaitOne (1000000);
fin2.Close();
(. En realidad, en el código hago un poco de equilibrio de carga que no parece ayudar)
tengo descubrí que ejecutar esta versión paralela solo vale la pena cuando hay más de 25,000 elementos en una matriz (aunque, un mínimo de 50,000 parece permitir que mi procesador respire más).
He hecho tantas mejoras como puedo pensar en mi pequeña máquina de doble núcleo. Me encantaría probar algunas ideas sobre el monstruo de 8 vías. Además, este trabajo se realizó en una pequeña MacBook de 13 "que ejecutaba Mono. Tengo curiosidad por cómo les va a otros en una instalación .NET 2.0 normal.
El código fuente en toda su fea gloria está disponible aquí: http://www.praeclarum.org/so/psort.cs.txt. limpiarlo si hay algún interés.
Si la clasificación debe ser estable (los elementos iguales mantienen su orden original), o si las comparaciones son caras (menos comparaciones), el algoritmo [mergesort] (http://www.martinstoeckli.ch/csharp/parallel_mergesort.html) es una buena opción. alternativa al quicksort. – martinstoeckli