在 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));
。我们有同样的结果。这两种结构有什么区别? 最佳答案
来自 documentation :parfeval
请求在并行池中的工作线程上异步执行。您可以使用 cancel
取消执行。它只是将其发送给任何自由 worker 。使用 parfevalOnAll
在所有 worker 上执行一个函数。 parfeval
的作用是提供通信框架( parallel.FevalFuture
)来确定函数评估是否完成以及结果如何。
它只会将评估发送给一个工作人员(我猜是下一个免费的工作人员),您可以通过调用 fetchOutputs
来获取输出(之前会等待完成)。然而 parfevalOnAll
在所有工作人员上执行该函数 - 可能没有很多有用的用例。将 parfeval
用于大多数/所有计算作业。
fetchNext
等待,直到 FEvalFutures
列表中的任何一个函数计算完成并返回索引和结果。 fetchOutputs
仅适用于单个 FEvalFuture
并等待并仅返回结果。因此,如果您安排了多个并行函数评估,请使用 fetchNext
,如果只有一个,请使用 fetchOutputs
。
为什么是循环?好吧,您已经安排了 10 次评估,因此您应该等待这 10 次的结果。您知道必须调用 fetchNext
10 次,因此使用循环。为了不等待太久,您使用 fetchNext
尽可能早地返回(当至少有一个结果时),但您仍然必须调用它 10 次。你可以用 while 循环来代替,但它会是一个循环。示例中的 for 循环就足够了。
是的,您可以使用它,但是您很可能会等待更长时间,直到第一个结果可供您使用。这通常是低效的。
原因是结果异步到达(因为它们是异步执行的)。那么为什么要等待第一个,如果第二个已经可用(并且可以进一步处理......)。最好等待下一个可用的 fetchNext
。
我希望清楚 Matlab 如何处理异步问题。它们基本上有一个函数 fetchNext
,它在一堆异步操作中的至少一个完成后立即返回。这通常是一种非常有效的设计模式。我强烈建议使用它。
关于matlab - MATLAB 的 parfeval 函数如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28474808/