在 MATLAB 文档中,我们有一个 parfeval 函数的代码示例。我对此有一些疑问。这是代码:

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
  • parfeval 如何工作?
  • 此函数是否将 magic 函数的每个 (idx) 评估发送给特定的工作人员?
  • 如果我们只有一行代码 f = parfeval(p,@magic,1,10); :
  • 这段代码如何工作?
  • 是否仅向一名 worker 发送评估并返回输出?
  • parfevalparfevalOnAll 有什么区别?
  • fetchNextfetchOutputs 有什么区别?
  • 为什么我们在第一个 fetchNext 循环和第二个循环之后需要 for 才能得到结果?
  • 第一次循环后我们没有所有结果?为什么?
  • 我认为我们正在等待 worker 在第二个循环中完成该过程。这是真的?我们不能没有任何循环吗?
  • 我想我们可以在第二个循环中使用 magicResults{idx} = fetchOutputs(f(idx));。我们有同样的结果。这两种结构有什么区别?
  • 最佳答案



    来自 documentation :parfeval 请求在并行池中的工作线程上异步执行。您可以使用 cancel 取消执行。它只是将其发送给任何自由 worker 。使用 parfevalOnAll 在所有 worker 上执行一个函数。 parfeval 的作用是提供通信框架( parallel.FevalFuture )来确定函数评估是否完成以及结果如何。



    它只会将评估发送给一个工作人员(我猜是下一个免费的工作人员),您可以通过调用 fetchOutputs 来获取输出(之前会等待完成)。然而 parfevalOnAll 在所有工作人员上执行该函数 - 可能没有很多有用的用例。将 parfeval 用于大多数/所有计算作业。


    fetchNext 等待,直到 FEvalFutures 列表中的任何一个函数计算完成并返回索引和结果。 fetchOutputs 仅适用于单个 FEvalFuture 并等待并仅返回结果。因此,如果您安排了多个并行函数评估,请使用 fetchNext,如果只有一个,请使用 fetchOutputs

    为什么是循环?好吧,您已经安排了 10 次评估,因此您应该等待这 10 次的结果。您知道必须调用 fetchNext 10 次,因此使用循环。为了不等待太久,您使用 fetchNext 尽可能早地返回(当至少有一个结果时),但您仍然必须调用它 10 次。你可以用 while 循环来代替,但它会是一个循环。示例中的 for 循环就足够了。



    是的,您可以使用它,但是您很可能会等待更长时间,直到第一个结果可供您使用。这通常是低效的。

    原因是结果异步到达(因为它们是异步执行的)。那么为什么要等待第一个,如果第二个已经可用(并且可以进一步处理......)。最好等待下一个可用的 fetchNext

    我希望清楚 Matlab 如何处理异步问题。它们基本上有一个函数 fetchNext ,它在一堆异步操作中的至少一个完成后立即返回。这通常是一种非常有效的设计模式。我强烈建议使用它。

    关于matlab - MATLAB 的 parfeval 函数如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28474808/

    10-12 14:39