5

Me pregunto si se pueden ejecutar más de 8 subprocesos al mismo tiempo en un hardware con 8 núcleos.multithreading (openMP): cuántos subprocesos paralelos

Si es así, usando openMP para paralelizar N cálculos, podría crear trozos de tamaño, por ejemplo, N/8, y en cada hilo más tenedor en (N/8)/8 hilos, y tal vez aún más?

¿Cómo suceden las cosas cuando he anidado la paralelización? ¿Todavía tengo 8 hilos disponibles para el paralelo anidado?

Gracias!

Respuesta

10

8 núcleos solo pueden ejecutarse a lo sumo 8 subprocesos al mismo tiempo en un momento determinado. Sin embargo, mucho depende de lo que estén haciendo tus hilos. Si están realizando tareas intensivas de CPU, no se recomienda generar muchos más hilos que la cantidad de núcleos (algunos quizás estén bien). De lo contrario, la conmutación excesiva de contexto y las fallas de caché comenzarán a degradar el rendimiento. Sin embargo, si hay una E/S significativa, los hilos pueden estar bloqueados mucho, sin usar la CPU, por lo que puede ejecutar muchos más en paralelo.

En pocas palabras, debe medir el rendimiento en su caso particular, en su entorno particular.

Véase también this related thread.

+0

Creo que el entrelazado podría, en ciertos escenarios, acelerar las cosas? Por ejemplo, si había mucha espera para que finalizaran ciertos procesos? – ScarletAmaranth

+0

Parece que mi programa es más rápido (20%?) Utilizando paralelos anidados. Nunca hago cumplir la cantidad de hilos para usar, solo configuro omp_set_nested (true) – octoback

+0

@ScarletAmaranth, sí. I/O es el ejemplo más típico de esto (por lo tanto lo mencioné en mi respuesta), pero también hay otros casos. –

0

En primer lugar, no puede ejecutar más de 8 hilos. En segundo lugar, recurrir al paralelismo anidado si nada funciona, ya que OpenMP tiene que mejorar mucho en este aspecto.

1

Los procesadores de CPU modernos tienen la opción de hiper-enhebrar.
Significa que la tubería puede ejecutar dos o más hilos al mismo tiempo.

lo tanto, el número de hilos que se pueden ejecutar al mismo tiempo es:
total_threads = num_procs * factor de hyperthreading

En general, el factor de hyperthreading = 2.

Para una carga de trabajo intensivo de la CPU, debe ejecutar total_threads. Para una carga de trabajo intensiva io, debe usar total_threads * 2 hilos. De esta manera, podemos superponer el cálculo de algunos hilos con io de otros hilos.

Estas reglas de pulgar son las que sigo. Puede cambiarlo según la carga de trabajo.