主要内容

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

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

下面的示例产生相同的结果,使用-loop在左边,aparfor-loop在右边。在MATLAB命令窗口中试试这个例子:

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

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

请注意

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

控件之后,在客户机工作区中可以使用数组元素parfor-loop,与a完全相同循环。

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

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

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

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

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

代码分析器消息报告第2行上的问题。它解释了在parfor循环中,变量“x”以不同的方式被索引,这可能会导致迭代之间的依赖关系。

然而,在其他情况下,Code Analyzer无法标记依赖项。

为其他常见的帮助parfor问题,请参见嵌套的parfor和for-Loops和其他parfor需求

另请参阅

相关的例子

更多关于