matlab - Error de dos bucles usando parfor en el externo para
loops parallel-processing (2)
En cuanto a exactamente por qué no funciona con el bucle externo, no estoy seguro. MATLAB tiene regulaciones muy estrictas sobre qué puede y qué no puede entrar en el bucle de parfor
que no siempre son claras.
La solución "simple" sería envolver todo lo que tiene dentro de su bucle de parfor
en una función, entonces parfor
repentinamente se come todo. es decir
function Biggers = parforfunc(A,B,ii)
for jj= 1:size(B,1)
if B(ii,1) > A(jj,1)
Biggers(ii,jj) = A(jj,1);
end
end
end
Guarde eso como parforfunc.m
y ejecute su script con
A = rand(1000,1);
B = rand(1000,1);
Biggers = zeros(size(B,1),size(A,1));
parfor ii = 1:size(A,1)
Biggers = parforfunc(A,B,ii);
end
Necesito paralelizar un código para ahorrar tiempo. Tengo un bucle interno a otro bucle, y me gustaría paralelizar el externo (porque creo que de esta manera el código es más rápido). Mi código se ve así:
A = rand(1000,1);
B = rand(1000,1);
Biggers = zeros(1000,1000);
parfor i = 1:size(A,1)
for j= 1:1:size(B,1)
if B(i,1) > A(j,1)
Biggers(i,j) = A(j,1);
end
end
end
pero si lo ejecuto de esta manera obtengo el error:
Error: The variable Biggers in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview".
esta condición no ocurre si, en cambio, paralelizo el ciclo interno, es decir, si diseño el código como:
A = rand(1000,1);
B = rand(1000,1);
Biggers = zeros(1000,1000);
for i = 1:size(A,1)
parfor j= 1:1:size(B,1)
if B(i,1) > A(j,1)
Biggers(i,j) = A(j,1);
end
end
end
No entiendo por qué en el primer caso Biggers
no se considera una variable cortada, ya que cada trabajador debe enfocarse solo en una línea de mi variable.
¿Cómo puedo resolver el problema?
La respuesta de @Adriaan resuelve el problema cuidadosamente, pero si tiene curiosidad, aquí el problema son los límites "no constantes" del ciclo for
interno. Tú y yo podemos ver claramente que los límites del bucle for
interno son constantes en la práctica, pero las reglas de MATLAB para el parfor
requieren que los límites de cualquier bucle for
interno sean variables de "difusión". Por lo tanto, la solución es trivial: izar el cálculo de límites de bucle interno fuera del bucle de parfor
, así:
A = rand(1000,1);
B = rand(1000,1);
Biggers = zeros(1000,1000);
n = size(B,1);
parfor i = 1:size(A,1)
for j= 1:n
if B(i,1) > A(j,1)
Biggers(i,j) = A(j,1);
end
end
end
Este caso se describe en el documento .