¿Cómo funciona la función parfeval de MATLAB?
parallel-processing parfor (1)
- ¿Cómo funciona
parfeval
?- ¿Esta función envía cada evaluación (idx) de la función
magic
a un trabajador específico?
De la documentación : parfeval
solicita la ejecución asincrónica en un trabajador en un grupo paralelo. Puede cancelar la ejecución con cancel
. Simplemente lo envía a cualquier trabajador libre. Use parfevalOnAll
para ejecutar una función en todos los trabajadores. Lo que parfeval
hace es proporcionar el marco de comunicación ( parallel.FevalFuture
) para averiguar si la evaluación de la función ha finalizado y cuáles fueron los resultados.
- Si solo tuviéramos una línea de código
f = parfeval(p,@magic,1,10);
:
- ¿Cómo funcionaría este código?
- ¿Envía la evaluación solo a un trabajador y devuelve la salida?
- ¿Cuál es la diferencia entre
parfeval
yparfevalOnAll
?
Enviaría evaluación a un solo trabajador (supongo que el siguiente libre) y puede obtener la salida llamando a fetchOutputs
(esperará antes de que termine). sin embargo, parfevalOnAll
ejecuta la función en todos los trabajadores; probablemente no haya muchos usos útiles para esto. Use parfeval
para la mayoría / todos sus trabajos de computación.
- ¿Cuál es la diferencia entre
fetchNext
yfetchOutputs
?- ¿Por qué necesitamos
fetchNext
después del primer buclefor
y un segundo bucle para obtener los resultados?- No tenemos todos los resultados después del primer ciclo? ¿Por qué?
- Creo que estamos esperando que los trabajadores completen el proceso en el segundo ciclo. ¿Es esto cierto? ¿No podemos hacerlo sin ningún bucle?
fetchNext
espera hasta que fetchNext
cualquiera de las evaluaciones de función en una lista de FEvalFutures
y devuelve el índice y el resultado. fetchOutputs
solo funciona en un solo FEvalFuture
y espera esto y solo devuelve el resultado. Así que use fetchNext
si ha programado varias evaluaciones de funciones paralelas y fetchOutputs
si hubiera solo una.
¿Por qué un bucle? Bueno, ha programado 10 evaluaciones, por lo que debe esperar los resultados de estos 10. Sabe que debe llamar a fetchNext
10 veces, por lo tanto, utilice un bucle. Para no esperar demasiado, use fetchNext
que se devuelve lo antes posible (cuando hay al menos un resultado), pero aún tiene que llamarlo 10 veces. Podrías hacerlo con un ciclo while en lugar de un loop. El bucle for del ejemplo es adecuado.
- Creo que podemos usar
magicResults{idx} = fetchOutputs(f(idx));
en el segundo ciclo Tenemos los mismos resultados. ¿Cuál es la diferencia entre estas dos estructuras?
Sí, podría usarlo, pero probablemente esperaría más tiempo hasta que el primer resultado esté disponible para usted. Esto usualmente es ineficiente.
La razón es que los resultados llegan de manera sincronizada (ya que se ejecutan de manera sincronizada). Entonces, ¿por qué esperar al primero, si el segundo ya está disponible (y podría ser procesado más adelante tal vez ...). Mejor espera el siguiente disponible usando fetchNext
.
Espero que quede claro cómo trata Matlab de la asincronía. Básicamente tienen una función fetchNext
que regresa tan pronto como fetchNext
al menos una de un montón de operaciones asincrónicas. Este suele ser un patrón de diseño muy eficiente. Recomiendo usarlo.
En la documentación de MATLAB tenemos un ejemplo de código para la función parfeval
. Tengo algunas preguntas al respecto. Este es el código:
p = gcp();
%// To request multiple evaluations, use a loop.
for idx = 1:10
f(idx) = parfeval(p,@magic,1,idx); % Square size determined by idx
end
%// Collect the results as they become available.
magicResults = cell(1,10);
for idx = 1:10
%// fetchNext blocks until next results are available.
[completedIdx,value] = fetchNext(f);
magicResults{completedIdx} = value;
fprintf(''Got result with index: %d./n'', completedIdx);
end
- ¿Cómo funciona
parfeval
? - ¿Esta función envía cada evaluación (idx) de la función
magic
a un trabajador específico?
- ¿Cómo funciona
Si solo tuviéramos una línea de código
f = parfeval(p,@magic,1,10);
:- ¿Cómo funcionaría este código?
- ¿Envía la evaluación solo a un trabajador y devuelve la salida?
- ¿Cuál es la diferencia entre
parfeval
yparfevalOnAll
?
- ¿Cuál es la diferencia entre
fetchNext
yfetchOutputs
? - ¿Por qué necesitamos
fetchNext
después del primer buclefor
y un segundo bucle para obtener los resultados? - No tenemos todos los resultados después del primer ciclo? ¿Por qué?
- Creo que estamos esperando que los trabajadores completen el proceso en el segundo ciclo. ¿Es esto cierto? ¿No podemos hacerlo sin ningún bucle?
- ¿Cuál es la diferencia entre
Creo que podemos usar
magicResults{idx} = fetchOutputs(f(idx));
en el segundo ciclo Tenemos los mismos resultados. ¿Cuál es la diferencia entre estas dos estructuras?