主要内容

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

for 循环转换为 parfor 循环

在某些情况下,您必须修改代码以将 for 循环转换为 parfor 循环。此示例显示如何使用简单嵌套的 parfor 循环来诊断和修复 for 循环问题。在 MATLAB® 中运行此代码并检查结果。

for x = 0:0.1:1
    for y = 2:10
        A(y) = A(y-1) + y;
    end
end

为了加快代码速度,尝试将 for 循环转换为 parfor 循环。观察此代码是否产生错误。

parfor x = 0:0.1:1
    parfor y = 2:10
        A(y) = A(y-1) + y;
    end
end

在这种情况下,您不能简单地将 for 循环转换为 parfor 循环而不进行修改。为了使其正常工作,您必须在几个地方更改代码。要诊断问题,请在 MATLAB 编辑器中查找代码分析器消息。

Example MATLAB Code Analyzer messages indicating that parfor or spmd cannot be used inside another parfor loop and that the parfor-loop cannot run due to the way variable x is used.

此代码显示了当您尝试将 for 循环转换为 parfor 循环时常见的问题。

Parfor-loop example code showing common problems, including using a noninteger as the parfor loop variable, using nested parfor loops, and making an iteration of a parfor-loop dependent on a previous iteration.

为了解决这些问题,您必须修改代码以使用 parforparfor 循环体在并行池中以非确定性顺序使用多个 MATLAB 工作单元执行。因此,您必须满足 parfor 循环体的以下要求:

  1. parfor 循环的主体必须是独立的。一次循环迭代不能依赖于前一次迭代,因为迭代是以不确定的顺序并行执行的。在本示例中,

    A(y) = A(y-1) + y;
    不是独立的,因此不能使用 parfor。有关处理独立问题的后续步骤,请参阅确保 parfor 循环迭代相互独立

  2. 不能将 parfor 循环嵌套在另一个 parfor 循环内。该示例有两个嵌套的 for 循环,因此只能用 for 循环替换一个 parfor 循环。相反,您可以调用在另一个 parfor 循环体内使用 parfor 循环的函数。然而,这种嵌套的 parfor 循环不会给您带来任何计算上的好处,因为所有工作单元都用于并行化最外层循环。有关处理嵌套循环的帮助,请参阅 嵌套 parfor 和 for 循环以及其他 parfor 要求

  3. parfor 循环变量必须是连续增加的整数。在本示例中,

    parfor x = 0:0.1:1
    具有非整数循环变量,因此您不能在这里使用 parfor。您可以通过将循环变量的值更改为算法所需的整数值来解决此问题。有关对 parfor 循环变量进行故障排除的后续步骤,请参阅 确保 parfor 循环变量是连续增加的整数

  4. 您不能像在 parfor 循环中那样提前跳出 for 循环。不要在 parfor 循环体中包含 return 或 break 语句。没有通信,其他运行循环的 MATLAB 实例无法知道何时停止。作为替代方案,请考虑 parfeval

    如果您在将 for 循环转换为 parfor 循环时仍然遇到问题,请参阅 排除 parfor 循环中的变量故障

提示

您可以使用 tictocparfor 循环配置文件,以测量与相应的 for 循环相比的加速。使用 ticBytestocBytes 来测量在并行池中从工作单元传输的数据量。有关更多信息和示例,请参阅 探查 parfor 循环

另请参阅

| |

主题