matlab parallel-processing parfor

¿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.

  1. 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 y parfevalOnAll ?

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 y fetchOutputs ?
    • ¿Por qué necesitamos fetchNext después del primer bucle for 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.

  1. 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?
  1. 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 y parfevalOnAll ?
    • ¿Cuál es la diferencia entre fetchNext y fetchOutputs ?
    • ¿Por qué necesitamos fetchNext después del primer bucle for 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?
  2. 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?