主要内容

确保parfor-循环迭代是独立的

如果转换时出现错误循环,parfor-循环,确保您的parfor-loop迭代是独立的。parfor循环迭代有不能保证订单,而迭代顺序为循环是顺序.也parfor-loop迭代在不同的MATLAB上执行®并行池中的worker,这样迭代之间就不会共享信息。因此一个parfor-loop迭代不能依赖于前一个迭代的结果。该规则的唯一例外是在循环中使用减少变量

下面的示例使用-loop在左边和aparfor-右转。在你的MATLAB命令窗口中尝试这个例子:

清晰的一个A(i) = 1;结束一个
A = 1 2 3 4 5 6 7 8
清晰的一个parforA(i) = 1;结束一个
A = 1 2 3 4 5 6 7 8

的每个元素一个等于它的下标。的parfor-loop之所以有效,是因为每个元素仅由索引的循环变量决定,而不依赖于其他变量。具有独立任务的-循环是理想的候选对象parfor循环。

请注意

默认情况下,parfor自动启动并行工作器池(如果您还没有启动一个)。parfor如果您已经相应地设置了并行首选项,则使用默认集群配置文件创建池。

在本例中,数组元素在客户端工作区中可用parfor-loop,就像a循环。

现在在循环中使用非索引变量,或者索引不依赖于循环变量的变量.试试这些例子,并注意d之后:

清晰的一个d = 0;我= 0;I = 1:4 d = 1;(我)= d;结束维我
A = 2 4 6 8 d = 8 i = 4
清晰的一个d = 0;我= 0;parforI = 1:4 d = 1;(我)= d;结束维我
A = 2 4 6 8 d = 0 i = 0

虽然一个在这两个例子中,值是相同的吗d不是。在-loop时,迭代将按顺序执行,所以之后d具有在循环的最后一次迭代中所持有的值。在parfor-loop,但是,迭代是并行执行的,因此不可能进行赋值d在循环结束时定义的值。这种情况也适用于循环变量.因此,parfor-loop行为被定义为不会影响值d外循环。它们的值在循环前后保持不变。如果变量parfor-loop不是独立的,那么你可能会得到不同的答案循环。总之,一个parfor-loop要求每个迭代都是独立于其他迭代的。的所有代码parfor语句不应依赖于循环迭代序列。

代码分析器可以帮助诊断循环迭代是否相互依赖。示例中的代码显示了根据前一个迭代定义的迭代:

parforx(K) = x(K -1) + K结束
在MATLAB编辑器中查找代码分析器消息。在这种情况下,Code Analyzer报告依赖关系问题。

然而,在其他情况下,代码分析器无法标记依赖项。

寻求其他常见的帮助parfor问题,请参见嵌套parfor和for循环以及其他parfor需求

另请参阅

相关的例子

更多关于