MATLAB';什么是parfeval函数?
在MATLAB文档中,我们有一个MATLAB';什么是parfeval函数?,matlab,parallel-processing,parfor,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. mag
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
- 此函数是否将
函数的每个(idx)评估值发送给特定的工作人员magic
f=parfeval(p,@magic,1,10)代码>:
- 这段代码是如何工作的李>
- 它是否只向一个工人发送评估并返回输出李>
parfeval
和parfevalOnAll
之间有什么区别
和fetchNext
之间有什么区别李>fetchOutputs
- 为什么在第一个
循环之后需要for
,然后需要第二个循环才能得到结果李>fetchNext
- 第一次循环后我们没有所有结果?为什么?李>
- 我认为我们正在等待工人完成第二个循环的过程。这是真的吗?我们不能没有任何循环吗
magicResults{idx}=fetchOutputs(f(idx))代码>在第二个循环中。我们得到了同样的结果。这两种结构的区别是什么
是如何工作的李>parfeval
- 此函数是否将
函数的每个(idx)评估值发送给特定的工作人员magic
parfeval
请求在并行池中的工作线程上异步执行。您可以使用cancel
取消执行。它只是把它发送给任何自由工作者。使用parfevalOnAll
在所有工人身上执行函数。parfeval
所做的是提供通信框架(parallel.FevalFuture
),以确定功能评估是否完成以及结果如何
f=parfeval(p,@magic,1,10)代码>:
- 这段代码是如何工作的李>
- 它是否只向一个工人发送评估并返回输出李>
parfeval
和parfevalOnAll
之间有什么区别
fetchOutputs
(将在之前等待完成)获取输出<但是,code>parfevalOnAll在所有worker上执行该函数-可能没有太多有用的用例。对大多数/所有计算作业使用parfeval
和fetchNext
之间有什么区别李>fetchOutputs
- 为什么在第一个
循环之后需要for
,然后需要第二个循环才能得到结果李>fetchNext
- 第一次循环后我们没有所有结果?为什么?李>
- 我认为我们正在等待工人完成第二个循环的过程。这是真的吗?我们不能没有任何循环吗
fetchNext
等待,直到FEvalFutures
列表中的任何一个函数求值完成并返回索引和结果fetchOutputs
只在单个FEvalFuture
上工作,并等待此操作并仅返回结果。因此,如果您计划了多个并行函数求值,请使用fetchNext
,如果只有一个并行函数求值,请使用fetchOutputs
为什么是循环?你已经安排了10次评估,所以你应该等待这10次评估的结果。您知道必须调用fetchNext
10次,因此使用循环。为了不等待太久,您可以使用fetchNext
,它会尽早返回(当至少有一个结果时),但您仍然需要调用它10次。您可以使用while循环,但它将是一个循环。示例中的for循环就足够了
magicResults{idx}=fetchOutputs(f(idx))代码>在第二个循环中。我们得到了同样的结果。两者的区别是什么
这两个结构
fetchNext
等待下一个可用的
我希望能弄清楚Matlab是如何处理异步性的。它们基本上有一个函数
fetchNext
,它在一系列异步操作中至少有一个操作完成后立即返回。这通常是一种非常有效的设计模式。我强烈建议使用它。@embert。感谢您的完美编辑;-)希望你能尽快得到答案。非常感谢你详细的回答。因此,正如您所说,当我们使用parfevalOnAll
时,它将向所有工人发送功能评估。这在上面的代码中是如何工作的?例如,对于idx=1
它将在单独的workers中计算magic(1)
4次(工作人数)?@user2991243是的,确切地说,它将使用相同的参数执行相同的函数4次(4个工作人数)。这通常不是很有用。有关parfevalonall的任何有用的应用,请参见文档中的示例:我在此处添加了一个新的相关问题: