MATLAB 的 parfeval 函数是如何工作的?

How does MATLAB's parfeval function work?

在 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);

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

    • How does parfeval work?
    • Does this function send every (idx) evaluational of the magic function to a specific worker?

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

  1. If we'd only have one line of code f = parfeval(p,@magic,1,10);:
    • How would this code work?
    • Will it send evaluation only to one worker and returns the output?
    • What is the difference between parfeval and parfevalOnAll?

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

    • What is the difference between fetchNext and fetchOutputs?
    • Why do we need fetchNext after the first for loop and a second loop to get the results?
    • We don't have all results after first loop? Why?
    • I think we are waiting for workers to complete the process in second loop. Is this true? Can't we do it without any loop?

fetchNext 等到 FEvalFutures 列表中的任何一个函数求值完成并且 returns 索引和结果。 fetchOutputs 仅在单个 FEvalFuture 上工作并等待此结果和 returns 仅结果。因此,如果您安排了多个并行函数评估,请使用 fetchNext,如果只有一个,请使用 fetchOutputs

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

  1. I think we can use magicResults{idx} = fetchOutputs(f(idx)); in the second loop. We have the same results. What is difference between these two structures?

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

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

我希望大家清楚 Matlab 如何尝试处理异步性。他们基本上有一个函数 fetchNext ,一旦一堆异步操作中的至少一个完成就 returns 。这通常是一种非常有效的设计模式。强烈推荐使用。