在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);
:
parfeval
和parfevalOnAll
之间的区别是什么?fetchNext
和fetchOutputs
之间有什么区别? fetchNext
循环和第二个循环之后我们需要for
来获得结果? 我认为我们可以在第二个循环中使用magicResults{idx} = fetchOutputs(f(idx));
。我们有相同的结果。这两种结构有什么区别?
答案 0 :(得分:4)
- 醇>
parfeval
如何运作?- 此函数是否将
magic
函数的每个(idx)评估发送给特定工作者?
来自documentation:parfeval
请求并行池中的worker上的异步执行。您可以使用cancel
取消执行。它只是将它发送给任何自由工作者。使用parfevalOnAll
对所有工作人员执行功能。 parfeval
的作用是提供通信框架(parallel.FevalFuture
),以确定功能评估是否已完成以及结果是什么。
- 如果我们只有一行代码
醇>f = parfeval(p,@magic,1,10);
:
- 这段代码怎么样?
- 它只会向一个工人发送评估并返回输出吗?
parfeval
和parfevalOnAll
之间的区别是什么?
它会将评估仅发送给一个工作人员(我猜测下一个工作人员),您可以通过调用fetchOutputs
来获取输出(将等待之前完成)。然而,parfevalOnAll
执行所有工作者的功能 - 可能没有很多有用的用例。使用parfeval
进行大部分/全部计算工作。
- 醇>
fetchNext
和fetchOutputs
之间有什么区别?- 为什么在第一个
fetchNext
循环和第二个循环之后我们需要for
来获得结果?- 我们在第一次循环后没有所有结果?为什么?
- 我认为我们正在等待工人在第二轮中完成这个过程。这是真的?我们不能没有任何循环吗?
fetchNext
等待,直到FEvalFutures
列表中的任何一个函数计算结束,并返回索引和结果。 fetchOutputs
仅适用于单个FEvalFuture
并等待此操作并仅返回结果。因此,如果您已安排多个并行函数评估,请使用fetchNext
;如果只有一个,则使用fetchOutputs
。
为什么要循环?那么你已经安排了10个评估,所以你应该等待这些10的结果。你知道你必须调用fetchNext
10次,因此使用一个循环。为了不等待太久,你可以尽早使用fetchNext
(当至少有一个结果时),但你仍然需要调用它10次。您可以使用while循环,但它将是一个循环。来自示例的for循环就足够了。
- 我认为我们可以在第二个循环中使用
醇>magicResults{idx} = fetchOutputs(f(idx));
。我们有相同的结果。有什么区别 这两个结构?
是的,你可以使用它,但是你很可能会等到第一个结果可用。这通常效率低下。
原因是结果异步到达(因为它们被异步执行)。那么为什么要等到第一个,如果第二个已经可用(并且可以进一步处理,也许......)。最好使用fetchNext
等待下一个可用的。
我希望很清楚Matlab如何处理异步性问题。它们基本上有一个函数fetchNext
,一旦完成一堆异步操作中的至少一个,它就会返回。这通常是一种非常有效的设计模式。我强烈建议使用它。