¿Cuál es la forma correcta de paralelizar un bucle bidimensional vergonzosamente paralelo en OpenMP? El número de dimensiones se conoce en tiempo de compilación, pero las dimensiones serán grandes no. Cualquiera de ellos puede ser uno, dos o un millón. Ciertamente no quierobucle OpenMP anidado multidimensional
Pensamientos N omp parallel
's para un bucle de N dimensiones ...:
El problema es conceptualmente simple. Solo el bucle 'más grande' más externo necesita ser paralelizado, pero las dimensiones del bucle son desconocidas en tiempo de compilación y pueden cambiar.
¿Establecerá dinámicamente
omp_set_num_threads(1)
y#pragma omp for schedule(static, huge_number)
que ciertas paralelizaciones de bucle sean no operativas? ¿Esto tendrá efectos secundarios/gastos generales no deseados? Se siente como un kludge.El OpenMP Specification (2.10, A.38, A.39) indica la diferencia entre el paralelismo anidado conforme y el no conforme, pero no sugiere el mejor enfoque para este problema.
Es posible volver a ordenar los bucles, pero puede provocar muchos errores de caché. Desenrollar es posible pero no trivial. ¿Hay otra manera?
Esto es lo que me gustaría poner en paralelo:
for(i0=0; i0<n[0]; i0++) {
for(i1=0; i1<n[1]; i1++) {
...
for(iN=0; iN<n[N]; iN++) {
<embarrasingly parallel operations>
}
...
}
}
Gracias!
+1 para una pregunta bien presentada – pmg
Obtener la respuesta correcta se trata de hacer la pregunta correcta. 'Por supuesto, no está de más consultar las especificaciones. :) – Ricky