matlab loops parallel-processing parfor

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 .