主要内容

parfor

执行-在worker上并行循环迭代

描述

例子

parforloopVarinitValendVal语句;结束执行-在并行池中的worker上并行循环迭代。

MATLAB®中执行循环体命令语句的值loopVar之间的initVal而且endValloopVar指定以1递增的整数值的向量。如果您有并行计算工具箱™,则语句可以在多核计算机或集群上的并行工作池上执行。就像-loop中,可以包含单行或多行语句

来找出parfor可以帮助提高产量,明白吗决定何时使用parfor

parfor不同于传统的-loop方法如下:

例子

parfor (loopVarinitValendVal);语句;结束使用指定并行池中用于计算的最大工作数语句在循环体中。必须为非负整数。

默认情况下,MATLAB使用并行池中可用的worker。上的工作人员数量可以更改首页页中的环境节,通过选择平行>平行的偏好.您可以通过使用重写并行池中的默认工作数parpool.当泳池里没有工人的时候为零时,MATLAB仍然以不确定的顺序执行循环体,但不是并行执行。在测试代码时,可以使用此语法在并行和串行执行之间切换。

使用这种语法,要并行地执行迭代,您必须有一个并行的工作人员池。默认情况下,如果执行parfor,您将自动在默认概要文件定义的并行环境上创建一个并行工作者池。默认的并行环境是流程.您可以更改您的个人资料平行的偏好.详情请参见指定你的并行偏好

parfor (loopVarinitValendVal选择);语句;结束使用选择指定用于评估的资源语句在循环体中。创建一组parfor选项使用parforOptions函数。使用这种方法,您可以运行parfor不需要先创建并行池并控制如何创建parfor将迭代划分为工作人员的子范围。

例子

parfor (loopVarinitValendVal集群);语句;结束执行语句关于工人集群不需要创建并行池。这相当于执行parfor (loopVar = initVal:endVal,parforOptions(cluster));语句;结束

例子

全部折叠

创建一个parfor-loop用于计算密集型任务,并测量结果的加速。

在MATLAB编辑器中,输入以下内容循环。若要测量所经过的时间,请添加抽搐而且toc

Tic n = 200;A = 500;A = 0 (1,n);i = 1:n a(i) = max(abs(eig(rand(a))));结束toc

运行脚本,并记录所消耗的时间。

运行时间为31.935373秒。

在脚本中,替换带a的-循环parfor循环。

Tic n = 200;A = 500;A = 0 (1,n);parfori = 1:n a(i) = max(abs(eig(rand(a))));结束toc

运行新脚本,然后再运行一次。第一次运行比第二次运行慢,因为必须启动并行池,并且必须使代码对工作人员可用。注意第二次运行所花费的时间。

默认情况下,MATLAB会自动在本地机器上打开并行工作池。

运行时间为10.760068秒。

类型的转换可以加快计算速度-循环成parfor-循环四个工人。您可以通过增加并行池中的工作人员数量来进一步减少运行时间。有关更多信息,请参见将for-Loops转换为parfor-Loops而且将parfor-Loops扩展到集群和云

您可以指定工人的最大数量对于一个parfor循环。集M = 0在桌面MATLAB中运行循环的主体,不使用worker,即使池是打开的。当M = 0, MATLAB仍然以不确定的顺序执行循环体,但不是并行执行,这样你就可以检查你的parfor-loops是独立的,适合在worker上运行。类的内容的最简单的调试方法parfor循环。类的主体中不能直接设置断点parfor类体中调用的函数中设置断点parfor循环。

指定M = 0来运行一个parfor-loop在桌面MATLAB中,即使池是打开的。

M = 0;% M指定最大工人数Y = ones(1100);parfor(i = 1:100,M) y(i) = i;结束

要控制并行池中的工作线程数,请参见指定你的并行偏好而且parpool

若要度量当前并行池中进出工作线程的数据量,请添加ticBytes (gcp)而且tocBytes (gcp)前后parfor循环。使用gcp作为获取当前并行池的参数。

删除当前的并行池(如果仍然有)。

删除(gcp (“nocreate”))
抽搐ticBytes (gcp);N = 200;A = 500;A = 0 (1,n);parfori = 1:n a(i) = max(abs(eig(rand(a))));结束tocBytes toc (gcp)

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

默认情况下,MATLAB会自动在本地机器上打开并行工作池。

使用'Processes'配置文件启动并行池(parpool)…连接到4个工人. ...BytesSentToWorkers BytesReceivedFromWorkers __________________ ________________________ 1 15340 7024 2 13328 5712 3 13328 5704 4 13328 5728 Total 55324 24168

您可以使用ticBytes而且tocBytes检查并行池中工作人员之间传输的数据量的结果。本例中数据传输量较小。欲了解更多有关parfor循环,看决定何时使用parfor而且将for-Loops转换为parfor-Loops

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

Cluster = parcluster;

运行parfor计算时,将集群对象作为第二个输入参数传递给parfor

当你使用这种方法时,parfor可以使用集群中所有可用的worker,并且只要循环完成,worker就可用。如果您的集群不支持并行池,这种方法也很有用。万博1manbetx如果您想控制其他选项,包括迭代的分区,请使用parforOptions

数值= [3 3 3 7 3 3 3];parfor(i=1:数值(值),群集)out(i) = norm(pinv(rand(值(i)*1e3)));结束

使用此语法可以在大型集群上运行parfor,而不会消耗过多的worker。

输入参数

全部折叠

具有初始值的循环索引变量initVal最终值endVal.变量可以是任何数字类型,值必须是整数。

确保你的parfor-loop变量是连续递增的整数。有关更多帮助,请参见排除parfor-Loops中的变量故障

的范围parfor-loop变量不能超过支持的范围。万博1manbetx有关更多帮助,请参见避免parfor-Loops中的溢出

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

初始值循环索引变量,loopVar.变量可以是任何数字类型,值必须是整数。与endVal,指定parfor范围向量,必须是这样的形式M: N

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

最终值循环索引变量,loopVar.变量可以是任何数字类型,值必须是整数。与initVal,指定parfor范围向量,必须是这样的形式M: N

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

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

您可能需要修改代码才能使用parfor循环。有关更多帮助,请参见将for-Loops转换为parfor-Loops

不要嵌套parfor循环,看嵌套的parfor和for-Loops和其他parfor需求

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

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

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

例子:opts = parforOptions(parcluster);

集群,指定为平行的。集群对象,在该对象上parfor运行。要创建集群对象,请使用parcluster函数。

例子:cluster = parcluster('进程')

数据类型:平行的。集群

提示

  • 使用一个parfor循环时间:

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

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

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

    减法是这个规则的一个例外。一个减少变量累积的值依赖于所有的迭代,但与迭代顺序无关。有关更多信息,请参见减少变量

  • 当你使用parfor,您必须等待循环完成才能获得结果。您的客户端MATLAB被阻塞,您无法提前跳出循环。如果要获得中间的成绩,还是要突破一个-尽早循环,尝试parfeval代替。

  • 除非指定了集群对象,否则parfor-loop在现有的并行池上运行。如果不存在存储池,parfor启动一个新的并行池,除非在并行首选项中禁用了池的自动启动。如果没有平行池和parfor不能启动循环,循环在客户端会话中串行运行。

  • 如果AutoAttachFiles属性设置为真正的, MATLAB对a进行了分析parfor-loop以确定其执行所需的代码文件,请参见listAutoAttachedFiles.然后MATLAB自动将这些文件附加到并行池,以便工作人员可以使用这些代码。

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

  • 不要使用清晰的在一个parfor循环,因为它违反了工作空间的透明性。看到确保parfor-Loops或spmd语句的透明度

  • 你可以运行Simulin万博1manbetxk®模型与之并行parsim命令,而不是使用parfor循环。有关并行使用Simulink的更多信息和示例,请参见万博1manbetx运行多个模拟(万博1manbetx模型)

版本历史

在R2008a中引入