Cómo anidar múltiples bucles de Parfor.
parfor
es una forma conveniente de distribuir iteraciones independientes de cálculos intensivos entre varios "trabajadores". Una restricción significativa es queparfor
-los bucles no pueden ser anidados, e invariablemente, esa es la respuesta a preguntas similares comoahí yahí.
¿Por qué la paralelización a través de los límites del bucle es tan deseable
Considere la siguiente pieza de código donde las iteraciones toman una cantidad de tiempo altamente variable en una máquina que permite 4 trabajadores. Ambos bucles iterar más de 6 valores, claramente difíciles de compartir entre 4.
for row = 1:6
parfor col = 1:6
somefun(row, col);
end
end
Parece una buena idea elegir el bucle interno paraparfor
porque llamadas individuales asomefun
Son más variables que las iteraciones del bucle externo. Pero ¿y si el tiempo de ejecución para cada llamada asomefun
es muy similar? ¿Qué pasa si hay tendencias en el tiempo de ejecución y tenemos tres bucles anidados? Estas preguntas surgen regularmente, y la gente va aextremos.
Patrón necesario para combinar bucles.
Idealmente,somefun
se ejecuta para todos los pares derow
ycol
, y los trabajadores deben ocuparse independientemente de qué iter y está siendo variado. La solución debería verse como
parfor p = allpairs(1:6, 1:6)
somefun(p(1), p(2));
end
Desafortunadamente, incluso si supiera qué función incorporada crea una matriz con todas las combinaciones derow
ycol
, MATLAB se quejaría con un error.El rango de una declaración de parfor debe ser un vector de fila. Todavía,for
No se quejaría y iteraba muy bien sobre columnas. Una solución fácil sería crear esa matriz y luego indexarla conparfor
:
p = allpairs(1:6, 1:6);
parfor k = 1:size(pairs, 2)
row = p(k, 1);
col = p(k, 2);
somefun(row, col);
end
¿Cuál es la función incorporada en lugar deallpairs
que estoy buscando? Hay una convenientepatrón idiomático que alguien ha venido con?