parfor
在工作单元并行上并行执行 for
循环迭代
语法
说明
parfor
在并行池中工作单元上并行执行 loopVar
= initVal
:endVal
; statements
; end for
循环迭代。
MATLAB® 对 statements
和 loopVar
之间的 initVal
值执行 endVal
中的循环体命令。loopVar
指定一个以 1 为增量的整数值向量。如果您有 Parallel Computing Toolbox™,则 statements
的迭代可以在多核计算机或集群上的并行工作单元池中执行。与 for
循环一样,您可以在 statements
中包含一行或多行。
要了解 parfor
如何帮助提高您的吞吐量,请参阅 决定何时使用 parfor。
parfor
与传统的 for
循环有以下不同之处:
循环迭代以不确定的顺序并行执行。这意味着您可能需要修改代码以使用
parfor
。如需更多帮助,请参阅 将 for 循环转换为 parfor 循环。循环迭代必须连续,并增加整数值。
parfor
循环的主体必须是独立的。一次循环迭代不能依赖于前一次迭代,因为迭代是按照不确定的顺序执行的。如需更多帮助,请参阅 确保 parfor 循环迭代相互独立。不能在另一个
parfor
循环内使用parfor
循环。如需更多帮助,请参阅 嵌套 parfor 和 for 循环以及其他 parfor 要求。
parfor (
使用 loopVar
= initVal
:endVal
,M
); statements
; end M
指定并行池中用于评估循环体中的 statements
的最大工作单元数量。M
必须是非负整数。
默认情况下,MATLAB 使用并行池中可用的工作单元。您可以使用默认配置文件的 PreferredPoolNumWorkers
属性来更改并行池中默认的工作单元数量。要了解所有可能影响默认池大小的因素,请参阅 影响池大小的因素。您可以使用 parpool
函数覆盖并行池中默认的工作单元数量。当池中没有可用的工作单元或 M
为零时,MATLAB 仍会以不确定的顺序执行循环体,但不并行。测试代码时使用此语法在并行和串行执行之间切换。
使用此语法,要并行执行迭代,您必须有一个并行工作单元池。默认情况下,如果执行 parfor
,则会在默认配置文件定义的并行环境上自动创建一个并行工作单元池。默认的并行环境是 Processes。您可以在并行设置中修改您的配置文件。有关详细信息,请参阅指定并行设置。
parfor (
使用 loopVar
= initVal
:endVal
,opts
); statements
; endopts
来指定在循环体中评估 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
; endparallel.Pool
对象 pool
指定的并行池上执行 statements
。当您希望在与 gcp
函数返回的池不同的池上评估 parfor
语句时,请使用此语法。 (自 R2025a 起)
示例
输入参数
提示
在以下情况下使用
parfor
循环:您有许多简单计算的循环迭代。
parfor
将循环迭代分成几组,以便每个线程可以执行一组迭代。有一些循环迭代需要很长时间才能执行。
当循环中的迭代依赖于其他迭代的结果时,请不要使用
parfor
循环。减少是此规则的一个例外。归约变量会累积一个取决于所有迭代的值,但与迭代顺序无关。有关详细信息,请参阅归约变量。
当您使用
parfor
时,您必须等待循环完成才能获得结果。您的客户端 MATLAB 已被阻止,您无法提前摆脱循环。如果您想要获得中间结果,或者提前摆脱for
循环,请尝试parfeval
。除非您指定集群对象,否则
parfor
循环将在现有并行池上运行。如果不存在池,parfor
将启动一个新的并行池,除非在并行设置中禁用了池的自动启动。如果没有并行池并且parfor
无法启动并行池,则循环在客户端会话中串行运行。如果并行池的集群配置文件中的
AutoAttachFiles
属性设置为true
,则 MATLAB 将对parfor
循环执行分析,以确定其执行需要哪些代码文件,请参阅listAutoAttachedFiles
。然后 MATLAB 自动将这些文件附加到并行池,以便工作单元可以使用该代码。您不能在
parfor
循环中直接调用脚本。但是,您可以调用调用脚本的函数。不要在
parfor
循环内使用
,因为它违反了工作区透明度。请参阅确保 parfor 循环或 spmd 语句的透明度。clear
您可以使用
parsim
命令并行运行 Simulink® 模型,而不是使用parfor
循环。有关并行使用 Simulink 的更多信息和示例,请参阅 Running Multiple Simulations (Simulink)。对于 GPU 计算:
如果您有一个 GPU 并且循环迭代都使用相同的 GPU,请不要使用
parfor
循环。GPU 包含许多可以并行执行计算的微处理器,并且尝试使用parfor
循环进一步并行化 GPU 计算不太可能加快您的代码速度。如果您有多个 GPU 并且您的计算使用支持 GPU 的函数,请使用
parfor
循环。有关在parfor
循环中使用多个 GPU 的更多信息,请参阅 在多个 GPU 上运行 MATLAB 函数。