2012-01-10 17 views
11

Tengo un ciclo anidado. He reemplazado el primer Por con un Parallel.For() y la velocidad de cálculo aumentó.Nested Parallel.For() loops velocidad y rendimiento

Mi pregunta es sobre la sustitución del segundo por (dentro de uno) con un Parallel.For(). ¿Aumentará la velocidad? o no hay diferencia? o será más lento?

Editar:

Puesto que los núcleos no son ilimitados (por lo general no es de 2 a 8 núcleos), el bucle interior se está ejecutando en paralelo. Entonces, si cambio el interior por Parallel.For(), nuevamente se ejecuta en paralelo. Pero no estoy seguro de cómo cambia el rendimiento y la velocidad.

+0

Depende del número de núcleos, pero sospecho que no verá ninguna mejora. Pruébalo, sin embargo. – Ryan

+5

http://guyellisrocks.com/coding/nested-parallel-foreach/ ... ¿Qué podemos decirle que una simple prueba de referencia no lo haría? –

Respuesta

14

Desde la sección "Demasiado de grano fino, demasiado grano grueso" subsección, "anti-patrones" en "Patterns of parallel programming" libro de .NET parallel computing team:

La respuesta es que el mejor equilibrio se encuentra a través del desempeño pruebas.Si los gastos generales de paralelización son mínimos en comparación con en el trabajo que se está realizando, realice la paralelización tanto como sea posible: en este caso, que significaría la paralelización de ambos bucles. Si los gastos generales de paralelizaron el circuito interno degradarían el rendimiento en la mayoría de los sistemas , piénselo dos veces antes, ya que probablemente sea mejor que paralelice el circuito externo.

Eche un vistazo a esa subsección, es autónoma con ejemplos detallados de aplicaciones paralelas de trazado de rayos. Y su sugerencia de aplanar los bucles para tener un mejor grado de paralelismo puede ser útil para usted también.

1

Depende mucho de los datos y funciones que utiliza dentro de for y la máquina. Últimamente he estado jugando con parallel.for y parallel.foreach y descubrí que mis aplicaciones eran aún más lentas ... (en una máquina de 4 núcleos, probablemente si tienes un servidor de 24 núcleos es otra historia)

Creo que la gestión de los hilos implica demasiada sobrecarga ...

Incluso MS en su documentación (aquí hay un muy largo pdf en msdn al respecto http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=19222) admite que no hace que las aplicaciones se ejecuten más rápido. Tienes que intentarlo todo el tiempo, y si funciona, genial, y si no es mala suerte.

Deberías probar con el externo para y el interno, pero al menos en las aplicaciones que probé ninguno hizo la aplicación más rápido. Externo o interno no importaba mucho, solo estaba obteniendo los mismos tiempos de ejecución o incluso peor.

Tal vez si también usa colecciones concurrentes, obtiene un mejor rendimiento. Pero, de nuevo, sin intentarlo, no hay forma de saberlo.

EDIT:

simplemente me encontré con un buen enlace en MSDN que resultó ser muy útil (en mi caso) para mejorar el rendimiento Parallel.foreach http://msdn.microsoft.com/en-us/library/dd560853.aspx

3

Depende otra vez en muchos escenarios,

  1. Número de subprocesos paralelos que puede ejecutar su CPU.
  2. Número de iteraciones.

Si su CPU es un procesador de un solo núcleo, no obtendrá ningún beneficio.

Si el número de iteraciones es mayor, obtendrá algunas mejoras.

Si solo hay algunas iteraciones, será lento ya que implica sobrecarga adicional.