确保 parfor 循环迭代相互独立
如果在将 for 循环转换为 parfor 循环时出现错误,请确保 parfor 循环迭代是独立的。parfor 循环迭代没有保证的顺序,而 for 循环中的迭代顺序是连续的。此外,parfor 循环迭代在并行池中的不同 MATLAB® 工作单元上执行,因此迭代之间不会共享信息。因此,一次 parfor 循环迭代不能依赖于前一次迭代的结果。此规则的唯一例外是使用 归约变量 在循环中累积值。
以下示例产生等效结果,左侧使用 for 循环,右侧使用 parfor 循环。在您的 MATLAB 命令行窗口中尝试该示例:
clear A for i = 1:8 A(i) = i; end A A =
1 2 3 4 5 6 7 8 | clear A parfor i = 1:8 A(i) = i; end A A =
1 2 3 4 5 6 7 8 |
A 的每个元素等于其索引。parfor 循环之所以有效,是因为每个元素仅由索引循环变量决定,而不依赖于其他变量。具有独立任务的 for 循环是 parfor 循环的理想候选者。
注意
默认情况下,如果尚未启动工作单元,parfor 会自动启动一个并行工作单元池。如果您已相应地设置了并行设置,parfor 会使用默认集群配置文件创建一个池。
在示例中,数组元素在 parfor 循环之后在客户端工作区中可用,与 for 循环完全一样。
现在在循环内使用非索引变量,或者索引不依赖于循环变量 i 的变量。尝试这些示例,然后记下 d 和 i 的值:
clear A d = 0; i = 0; for i = 1:4 d = i*2; A(i) = d; end A d i A =
2 4 6 8
d =
8
i =
4 | clear A d = 0; i = 0; parfor i = 1:4 d = i*2; A(i) = d; end A d i A =
2 4 6 8
d =
0
i =
0 |
尽管两个示例中 A 的元素相同,但 d 的值却不相同。在 for 循环中,迭代按顺序执行,因此之后 d 具有其在循环的最后一次迭代中保存的值。然而,在 parfor 循环中,迭代并行执行,因此不可能在循环结束时为 d 分配一个定义的值。这种情况也适用于循环变量 i。因此,parfor 循环行为被定义成不会影响循环外的值 d 和 i。它们的值在循环前后保持不变。如果您的 parfor 循环中的变量不是独立的,那么您可能会得到与 for 循环中的答案不同的答案。摘要,parfor 循环要求每次迭代都独立于其他迭代。所有跟在 parfor 语句后面的代码都不应该依赖于循环迭代序列。
代码分析器可以帮助诊断循环迭代是否相互依赖。示例中的代码显示了根据前一次迭代定义的迭代:
parfor k = 2:10 x(k) = x(k-1) + k; end

然而,在其他情况下,代码分析器无法标记依赖关系。
有关其他常见 parfor 问题的帮助,请参阅 嵌套 parfor 和 for 循环以及其他 parfor 要求。