在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)求值发送给特定的worker?f = parfeval(p,@magic,1,10);
:
这段代码怎么样?
它会仅将评估发送给一个工人并返回输出吗?
parfeval
和parfevalOnAll
有什么区别?fetchNext
和fetchOutputs
有什么区别?
为什么我们在第一个fetchNext
循环和第二个循环之后需要for
来获得结果?
第一次循环后我们没有所有结果?为什么?
我想我们正在等待工人在第二轮循环中完成这个过程。这是真的?我们不能没有任何循环吗?magicResults{idx} = fetchOutputs(f(idx));
。我们有相同的结果。这两种结构有什么区别?
parfeval
如何运作? 此函数是否将magic
函数的每个(idx)求值发送给特定的worker?
来自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
if你已经安排了几个并行函数评估和fetchOutputs
,如果只有一个。
为什么循环?那么你已经安排了10个评估,所以你应该等待这些10的结果。你知道你必须调用fetchNext
10次,因此使用循环。为了不等待太久你使用fetchNext
尽可能早地回来(当至少有一个结果),但你仍然需要调用它10次。您可以使用while循环,但它将是一个循环。示例中的for循环就足够了。
- 我想我们可以在第二个循环中使用
magicResults{idx} = fetchOutputs(f(idx));
。我们有相同的结果。这两种结构有什么区别?
是的,你可以使用它,但是你很可能要等到第一个结果可用。这通常是低效的。
原因是结果异步到达(因为它们被异步执行)。那么为什么要等到第一个,如果第二个已经可用(并且可以进一步处理,也许......)。最好等待使用fetchNext
的下一个可用。
我希望它能清楚地表明Matlab如何处理异步性问题。它们基本上有一个函数fetchNext
,一旦完成一堆异步操作中的至少一个就返回它。这通常是一种非常有效的设计模式。我强烈建议使用它。