【问题标题】:How does MATLAB's parfeval function work?MATLAB 的 parfeval 函数是如何工作的?
【发布时间】:2015-02-12 10:17:43
【问题描述】:

在 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) 评估发送给特定的工作人员?
  1. 如果我们只有一行代码f = parfeval(p,@magic,1,10);

    • 此代码将如何工作?
    • 它会只向一名工作人员发送评估并返回输出吗?
    • parfevalparfevalOnAll 有什么区别?
    • fetchNextfetchOutputs 有什么区别?
    • 为什么在第一个for 循环和第二个循环之后需要fetchNext 才能获得结果?
    • 第一次循环后我们没有所有结果?为什么?
    • 我认为我们正在等待工作人员在第二个循环中完成该过程。这是真的?我们不能没有任何循环吗?
  2. 我认为我们可以在第二个循环中使用magicResults{idx} = fetchOutputs(f(idx));。我们有同样的结果。这两种结构有什么区别?

【问题讨论】:

  • @embert 。感谢您的完美编辑;-)
  • 希望您能尽快得到答复。

标签: matlab parallel-processing parfor


【解决方案1】:
    • parfeval 是如何工作的?
    • 此函数是否会将 magic 函数的每个 (idx) 评估发送给特定的工作人员?

来自documentationparfeval 请求在并行池中的工作程序上异步执行。您可以使用cancel 取消执行。它只是将它发送给任何免费的工人。使用parfevalOnAll 对所有工作人员执行功能。 parfeval 所做的是提供通信框架 (parallel.FevalFuture) 以了解函数评估是否完成以及结果如何。

  1. 如果我们只有一行代码f = parfeval(p,@magic,1,10);:
    • 此代码将如何工作?
    • 它会只向一名工作人员发送评估并返回输出吗?
    • parfevalparfevalOnAll 有什么区别?

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

    • fetchNextfetchOutputs 有什么区别?
    • 为什么在第一个for 循环和第二个循环之后需要fetchNext 才能获得结果?
    • 第一次循环后我们没有所有结果?为什么?
    • 我认为我们正在等待工作人员在第二个循环中完成该过程。这是真的?我们不能没有任何循环吗?

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

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

  1. 我认为我们可以在第二个循环中使用magicResults{idx} = fetchOutputs(f(idx));。我们有同样的结果。有什么区别 这两种结构?

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

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

我希望能清楚 Matlab 如何处理异步性。他们基本上有一个函数fetchNext,只要完成了一堆异步操作中的至少一个,它就会返回。这通常是一种非常有效的设计模式。我强烈推荐使用它。

【讨论】:

  • 非常感谢您的详细回答。因此,正如您所说,当我们使用 parfevalOnAll 时,它将向所有工作人员发送函数评估。这在上面的代码中是如何工作的?例如对于idx=1,它将在不同的工作人员中评估magic(1) 4 次(工作人员数量)?
  • @user2991243 是的,确切地说,它将使用相同的参数执行相同的函数 4 次(使用 4 个工作人员)。这通常不是很有用。对于 parfevalonall 的任何有用的应用程序,请参阅文档中的示例:mathworks.com/help/distcomp/parfevalonall.html
  • 我在这里添加了一个新的相关问题:stackoverflow.com/questions/28477824/…
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多