主要内容

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

parfor

在工作单元并行上并行执行 for 循环迭代

说明

parfor loopVar = initVal:endVal; statements; end 在并行池中工作单元上并行执行 for 循环迭代。

MATLAB®statementsloopVar 之间的 initVal 值执行 endVal 中的循环体命令。loopVar 指定一个以 1 为增量的整数值向量。如果您有 Parallel Computing Toolbox™,则 statements 的迭代可以在多核计算机或集群上的并行工作单元池中执行。与 for 循环一样,您可以在 statements 中包含一行或多行。

要了解 parfor 如何帮助提高您的吞吐量,请参阅 决定何时使用 parfor

parfor 与传统的 for 循环有以下不同之处:

示例

parfor (loopVar = initVal:endVal,M); statements; end 使用 M 指定并行池中用于评估循环体中的 statements 的最大工作单元数量。M 必须是非负整数。

默认情况下,MATLAB 使用并行池中可用的工作单元。您可以使用默认配置文件的 PreferredPoolNumWorkers 属性来更改并行池中默认的工作单元数量。要了解所有可能影响默认池大小的因素,请参阅 影响池大小的因素。您可以使用 parpool 函数覆盖并行池中默认的工作单元数量。当池中没有可用的工作单元或 M 为零时,MATLAB 仍会以不确定的顺序执行循环体,但不并行。测试代码时使用此语法在并行和串行执行之间切换。

使用此语法,要并行执行迭代,您必须有一个并行工作单元池。默认情况下,如果执行 parfor,则会在默认配置文件定义的并行环境上自动创建一个并行工作单元池。默认的并行环境是 Processes。您可以在并行设置中修改您的配置文件。有关详细信息,请参阅指定并行设置

示例

parfor (loopVar = initVal:endVal,opts); statements; end 使用 opts 来指定在循环体中评估 statements 时要使用的资源。使用 parforOptions 函数创建一组 parfor 选项。通过这种方法,您可以在集群上运行 parfor,而无需首先创建并行池,并控制 parfor 如何将迭代划分为工作单元范围。

parfor (loopVar = initVal:endVal,cluster); statements; endstatements 中的工作单元上执行 cluster,而无需创建并行池。这相当于执行 parfor (loopVar = initVal:endVal,parforOptions(cluster)); statements; end

示例

parfor (loopVar = initVal:endVal,pool); statements; end 在由 parallel.Pool 对象 pool 指定的并行池上执行 statements。当您希望在与 gcp 函数返回的池不同的池上评估 parfor 语句时,请使用此语法。 (自 R2025a 起)

示例

示例

全部折叠

为计算密集型任务创建一个 parfor 循环并测量由此产生的加速。

在 MATLAB 编辑器中,输入以下 for 循环。要测量经过的时间,请添加 tictoc

tic
n = 200;
A = 500;
a = zeros(1,n);
for i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
toc

运行脚本并记录经过的时间。

Elapsed time is 31.935373 seconds.

在脚本中,将 for 循环替换为 parfor 循环。

tic
n = 200;
A = 500;
a = zeros(1,n);
parfor i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
toc

运行新脚本,然后再次运行它。第一次运行比第二次运行慢,因为必须启动并行池,并且必须使代码可供工作单元使用。记下第二次运行的经过时间。

默认情况下,MATLAB 会自动在本地计算机上开启一个并行工作单元池。

Elapsed time is 10.760068 seconds. 

注意,通过将 for 循环转换为四个工作单元的 parfor 循环,您可以加快计算速度。您可以通过增加并行池中的工作单元数量来进一步减少经过的时间。有关详细信息,请参阅将 for 循环转换为 parfor 循环将 parfor 循环扩展到集群和云

您可以为 M 循环指定最大工作单元数量 parfor。设置 M =0 以在桌面 MATLAB 中运行循环体,而不使用工作单元,即使池已打开。当 M = 0、MATLAB 仍然以非确定性顺序执行循环体时,但不是并行,以便您可以检查 parfor 循环是否独立且适合在工作单元上运行。这是允许您调试 parfor 循环内容的最简单的方法。您不能直接在 parfor 循环体中设置断点,但您可以在从 parfor 循环体调用的函数中设置断点。

指定 M = 0 以在桌面 MATLAB 中运行 parfor 循环的主体,即使池已打开。

 M = 0;                     % M specifies maximum number of workers
 y = ones(1,100);
 parfor (i = 1:100,M)
      y(i) = i;
 end

要控制并行池中工作单元的数量,请参阅 指定并行设置parpool

要测量当前并行池中往返于工作单元之间的数据传输量,请在 ticBytes(gcp) 循环之前和之后添加 tocBytes(gcp)parfor。使用 gcp 作为参量来获取当前并行池。

如果您还有当前并行池,请将其删除。

delete(gcp('nocreate'))
tic
ticBytes(gcp);
n = 200;
A = 500;
a = zeros(1,n);
parfor i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
tocBytes(gcp)
toc

运行新脚本,然后再次运行它。第一次运行比第二次运行慢,因为必须启动并行池,并且必须使代码可供工作单元使用。

默认情况下,MATLAB 会自动在本地计算机上开启一个并行工作单元池。

Starting parallel pool (parpool) using the 'Processes' profile ... connected to 4 workers.
...
             BytesSentToWorkers    BytesReceivedFromWorkers
             __________________    ________________________

    1        15340                  7024                   
    2        13328                  5712                   
    3        13328                  5704                   
    4        13328                  5728                   
    Total    55324                 24168                   

您可以使用 ticBytestocBytes 结果来检查并行池中传输到和从工作单元的数据量。在这个示例中,数据传输很小。有关 parfor 循环的更多信息,请参阅 决定何时使用 parfor将 for 循环转换为 parfor 循环

使用 parcluster 函数创建一个集群对象,并使用它创建一组 parfor 选项。默认情况下,parcluster 使用您的默认集群配置文件。在 MATLAB 主页选项卡上的并行 > 选择并行环境中检查您的默认配置文件。

cluster = parcluster;

要在集群中直接运行 parfor 计算,请将集群对象作为第二个输入参量传递给 parfor

当您使用此方法时,parfor 可以使用集群中所有可用的工作单元,并且循环完成后工作单元即可使用。如果您的集群不支持并行池,这种方法也很有用。如果您想要控制其他选项,包括迭代分区,请使用 parforOptions

values = [3 3 3 7 3 3 3];
parfor (i=1:numel(values),cluster)
    out(i) = norm(pinv(rand(values(i)*1e3)));
end

使用此语法在大型集群上运行 parfor,而无需消耗超过必要时间的工作单元。

您可以指定要用于运行 parfor 循环的池,当您希望使用与 gcp 函数返回的池不同的池时。

在集群上启动一个包含 30 个工作单元的并行池,配置文件名为 myCluster

myClusterPool = parpool("myCluster",30);

使用池中的前 12 个工作单元创建一个池分区。

parforWorkers = myClusterPool.Workers(1:12);
parforPool = partition(myClusterPool,"Workers",parforWorkers);

要在池分区上运行 parfor 循环,将 parforPool 池对象作为第二个输入参量传递给 parfor

values = [3 8 5 7 3 12 3];
parfor(idx = 1:numel(values),parforPool)
    a(idx) = norm(pinv(rand(values(i)*1e3)));
end

输入参数

全部折叠

循环索引变量,初始值为 initVal,最终值为 endVal。该变量可以是任何数值类型,并且值必须是整数。

确保您的 parfor 循环变量是连续增加的整数。如需更多帮助,请参阅 排除 parfor 循环中的变量故障

parfor 循环变量的范围不能超出支持的范围。如需更多帮助,请参阅 避免 parfor 循环中的溢出

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

初始值循环索引变量,loopVar。该变量可以是任何数值类型,并且值必须是整数。使用 endVal 指定 parfor 范围向量,其必须为 M:N 形式。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

最终值循环索引变量,loopVar。该变量可以是任何数值类型,并且值必须是整数。使用 initVal 指定 parfor 范围向量,其必须为 M:N 形式。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

循环体,指定为文本。在 parfor 循环中执行的一系列 MATLAB 命令。

您可能需要修改代码以使用 parfor 循环。如需更多帮助,请参阅将 for 循环转换为 parfor 循环

不要嵌套 parfor 循环,请参阅嵌套 parfor 和 for 循环以及其他 parfor 要求

并行运行的最大工作单元数量,指定为非负整数。如果您指定了上限,那么即使有额外的工作单元可用,MATLAB 也不会使用超过该数量。如果您请求的工作单元数量多于可用工作单元数量,那么 MATLAB 将使用调用时可用的最大工作单元数量。如果循环迭代次数少于工作单元数量,则一些工作单元不执行任何工作。

如果 parfor 无法在多个工作单元上运行(例如,如果只有一个核心可用,或者 M 为 0),则 MATLAB 以串行方式执行循环。在这种情况下,MATLAB 仍然以不确定的顺序执行循环体。测试代码时使用此语法在并行和串行之间切换。

parfor 选项,指定为 ClusterOptions 对象。使用 parforOptions 函数创建一组 parfor 选项。

示例: opts = parforOptions(parcluster);

集群,指定为 parallel.Cluster 对象,parfor 在其上运行。要创建集群对象,请使用 parcluster 函数。

示例: cluster = parcluster('Processes')

数据类型: parallel.Cluster

自 R2025a 起

指定为 parallel.Pool 对象,parfor 在其上运行。

  • 要创建并行池,请使用 parpool 函数。

  • 要使用现有池中的子集,请使用 partition 函数。

提示

  • 在以下情况下使用 parfor 循环:

    • 您有许多简单计算的循环迭代。parfor 将循环迭代分成几组,以便每个线程可以执行一组迭代。

    • 有一些循环迭代需要很长时间才能执行。

  • 当循环中的迭代依赖于其他迭代的结果时,请不要使用 parfor 循环。

    减少是此规则的一个例外。归约变量会累积一个取决于所有迭代的值,但与迭代顺序无关。有关详细信息,请参阅归约变量

  • 当您使用 parfor 时,您必须等待循环完成才能获得结果。您的客户端 MATLAB 已被阻止,您无法提前摆脱循环。如果您想要获得中间结果,或者提前摆脱 for 循环,请尝试 parfeval

  • 除非您指定集群对象,否则 parfor 循环将在现有并行池上运行。如果不存在池,parfor 将启动一个新的并行池,除非在并行设置中禁用了池的自动启动。如果没有并行池并且 parfor 无法启动并行池,则循环在客户端会话中串行运行。

  • 如果并行池的集群配置文件中的 AutoAttachFiles 属性设置为 true,则 MATLAB 将对 parfor 循环执行分析,以确定其执行需要哪些代码文件,请参阅 listAutoAttachedFiles。然后 MATLAB 自动将这些文件附加到并行池,以便工作单元可以使用该代码。

  • 您不能在 parfor 循环中直接调用脚本。但是,您可以调用调用脚本的函数。

  • 不要在 parfor 循环内使用 clear,因为它违反了工作区透明度。请参阅确保 parfor 循环或 spmd 语句的透明度

  • 您可以使用 parsim 命令并行运行 Simulink® 模型,而不是使用 parfor 循环。有关并行使用 Simulink 的更多信息和示例,请参阅 Running Multiple Simulations (Simulink)

  • 对于 GPU 计算:

    • 如果您有一个 GPU 并且循环迭代都使用相同的 GPU,请不要使用 parfor 循环。GPU 包含许多可以并行执行计算的微处理器,并且尝试使用 parfor 循环进一步并行化 GPU 计算不太可能加快您的代码速度。

    • 如果您有多个 GPU 并且您的计算使用支持 GPU 的函数,请使用 parfor 循环。有关在 parfor 循环中使用多个 GPU 的更多信息,请参阅 在多个 GPU 上运行 MATLAB 函数

扩展功能

全部展开

版本历史记录

在 R2008a 中推出

全部展开