确保parfor
-循环迭代是独立的
如果转换时出现错误为
循环,parfor
-循环,确保你的parfor
-loop迭代是独立的。parfor
-循环迭代无保证订单,而迭代顺序为为
循环是顺序。也parfor
-循环迭代在不同的MATLAB上执行®并行池中的工作人员,这样迭代之间就不会共享信息。因此一个parfor
-loop迭代不能依赖于前一次迭代的结果。唯一的例外是在循环中使用减少变量。
下面的示例使用为
-loop在左边,aparfor
-loop在右边。在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;I = 0;为I = 1:4 d = I *2;A(i) = d;结束A:是的。 d = 8 i = 4 |
清晰的一个D = 0;I = 0;parforI = 1:4 d = I *2;A(i) = d;结束A:是的。 A = 2 4 6 8 d = 0 i = 0 |
尽管一个
的值是一样的吗d
不是。在为
-loop,迭代是顺序执行的,所以之后d
具有它在循环的最后一次迭代中保存的值。在parfor
但是,迭代是并行执行的,因此不可能赋值d
在循环结束时定义的值。这种情况也适用于循环变量我
。因此,parfor
定义-loop行为,使其不影响值d
和我
在循环之外。它们的值在循环前后保持不变。如果你的变量parfor
-循环不是独立的,那么你可能会得到不同的答案为
循环。总之,parfor
-loop要求每个迭代独立于其他迭代。后的所有代码parfor
语句不应依赖于循环迭代顺序。
代码分析器可以帮助诊断循环迭代是否相关。示例中的代码显示了根据前一次迭代定义的迭代:
parforK = 2:10 x(K) = x(K -1) + K;结束
但是,在其他情况下,代码分析器无法标记依赖项。
寻求其他常用的帮助parfor
问题,请参见嵌套parfor和for循环以及其他parfor需求。