MATLAB的parfeval功能如何工作?

问题描述 投票:3回答:1

在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
  1. parfeval如何运作? 此函数是否将magic函数的每个(idx)求值发送给特定的worker?
  2. 如果我们只有一行代码f = parfeval(p,@magic,1,10);: 这段代码怎么样? 它会仅将评估发送给一个工人并返回输出吗? parfevalparfevalOnAll有什么区别?
  3. fetchNextfetchOutputs有什么区别? 为什么我们在第一个fetchNext循环和第二个循环之后需要for来获得结果? 第一次循环后我们没有所有结果?为什么? 我想我们正在等待工人在第二轮循环中完成这个过程。这是真的?我们不能没有任何循环吗?
  4. 我想我们可以在第二个循环中使用magicResults{idx} = fetchOutputs(f(idx));。我们有相同的结果。这两种结构有什么区别?
matlab parallel-processing parfor
1个回答
4
投票
  1. parfeval如何运作? 此函数是否将magic函数的每个(idx)求值发送给特定的worker?

来自documentationparfeval请求并行池中的worker上的异步执行。您可以使用cancel取消执行。它只是将它发送给任何自由工作者。使用parfevalOnAll对所有工作人员执行功能。 parfeval所做的是提供沟通框架(parallel.FevalFuture),以确定功能评估是否已完成以及结果是什么。

  1. 如果我们只有一行代码f = parfeval(p,@magic,1,10);: 这段代码怎么样? 它会仅将评估发送给一个工人并返回输出吗? parfevalparfevalOnAll有什么区别?

它会将评估发送给只有一个工作者(我猜是下一个工作者),你可以通过调用fetchOutputs获取输出(将等待之前完成)。然而,parfevalOnAll执行所有工作人员的功能 - 可能没有很多有用的用例。使用parfeval进行大部分/全部计算工作。

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

fetchNext等待,直到FEvalFutures列表中的任何一个函数求值完成并返回索引和结果。 fetchOutputs只适用于单个FEvalFuture并等待此并仅返回结果。所以使用fetchNextif你已经安排了几个并行函数评估和fetchOutputs,如果只有一个。

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

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

是的,你可以使用它,但是你很可能要等到第一个结果可用。这通常是低效的。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.