MATLAB的parfeval功能如何工作?

时间:2015-02-12 10:17:44

标签: matlab parallel-processing parfor

在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之间有什么区别?
    • 为什么在第一个fetchNext循环和第二个循环之后我们需要for来获得结果?
    • 我们在第一次循环后没有所有结果?为什么?
    • 我认为我们正在等待工人在第二轮中完成这个过程。这是真的?我们不能没有任何循环吗?
  2. 我认为我们可以在第二个循环中使用magicResults{idx} = fetchOutputs(f(idx));。我们有相同的结果。这两种结构有什么区别?

1 个答案:

答案 0 :(得分:4)

  
      
    •   
    • parfeval如何运作?
    •   
    • 此函数是否将magic函数的每个(idx)评估发送给特定工作者?
    •   
  1.   

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

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

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

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

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

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

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

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

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

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