Estoy usando openMP para ejecutar instancias de mi simulación en paralelo.Cómo forzar a openMP a ejecutar iteraciones en un orden específico
#pragma omp parallel for private(part) shared(P,lfcc,temp)
for (part = 0; part < P->Parts; part++)
parte de los controles de bucle si el archivo de salida con número de índice "parte" ya existen (para que pueda ejecutar la simulación para un determinado valor de "Partes", y más tarde aumentarlo sin sobrescribir los resultados existentes) . Sin embargo, esto requiere que la iteración se ejecute en orden. Es decir, para n subprocesos, primero debe ejecutar simultáneamente las partes (1) - (n), seguidas por las partes (n + 1) - (2n) y así sucesivamente. en este momento (con 3 hilos ejecutándose en paralelo, y "partes" configuradas en N), el comportamiento es diferente, ejecuta las primeras partes (0), (N/3), (2N/3) seguido de (1), (N/3 + 1), (2N/3 + 1) y así sucesivamente.
Supongamos ahora que inicialmente quería 30 piezas que se completaron todas. Luego decido que necesito más partes y cambio "Partes" a 45. Luego, los primeros hilos obtienen partes (1) - (15), el segundo (16) - (30) y el tercero (31-45). Los dos primeros hilos descubren rápidamente que todas sus partes asignadas ya se han completado y dejarán que el último hilo funcione solo (si pongo una cláusula de barrera antes de que el programa finalice).
Una solución simple es dejar que la variable "parte" comience no con 0 sino con m + 1, donde m es el número de partes completadas previamente. Pero me preguntaba si era posible obligar a openMP a ejecutar la iteración en el orden que se muestra en negrita arriba.
Probablemente no hay una mejor manera distinta a tirar un lazo externo sobre la región paralela que los bucles sobre todos sus bloques secuenciales. – Mysticial
¿Entonces quieres una partición en bloque? Al igual que si quiero procesar 40 elementos con 4 hilos, trabajarán en 0..9, 10..19, 20..29 y 30..39 respectivamente? – Tudor
Tudor, necesito el otro camino. con 4 hilos, haga 1-4,5-8,9-12 ... –