主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

确保 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 的变量。尝试这些示例,然后记下 di 的值:

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 循环行为被定义成不会影响循环外的值 di。它们的值在循环前后保持不变。如果您的 parfor 循环中的变量不是独立的,那么您可能会得到与 for 循环中的答案不同的答案。摘要,parfor 循环要求每次迭代都独立于其他迭代。所有跟在 parfor 语句后面的代码都不应该依赖于循环迭代序列。

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

parfor k = 2:10
    x(k) = x(k-1) + k;
end
在 MATLAB 编辑器中查找代码分析器消息。在这种情况下,代码分析器会报告依赖性问题。

Code Analyzer message reporting an issue on line 2. It explains that in a parfor-loop, variable 'x' is indexed in different ways, potentially causing dependencies between iterations.

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

有关其他常见 parfor 问题的帮助,请参阅 嵌套 parfor 和 for 循环以及其他 parfor 要求

另请参阅

主题