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?

Respuestas a la pregunta(3)

Su respuesta a la pregunta