主要内容

parfor

执行在worker上并行循环迭代

描述

例子

parforloopVarinitValendval.语句;结束执行- 在平行池中的工人上并行迭代。

MATLAB®执行循环正文命令语句对于价值观loopVar之间的initValendval.loopVar指定一个整数值递增1的向量。如果您有并行计算工具箱™,则语句可以在多核计算机或集群的并行工作池上执行。与一个在-loop中,可以包含单行或多行语句

找出如何parfor可以帮助提高你的吞吐量,明白吗决定什么时候使用parfor

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

例子

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

默认情况下,MATLAB使用并行池中的可用工作程序。你可以改变工人的数量首页选项卡中环境节中,通过选择平行>并行偏好.使用以下命令可以覆盖并行池中的默认工作人员数量parpool.当池中没有工作人员时为0时,MATLAB仍然以不确定的顺序执行循环体,但不是并行执行。在测试代码时,可以使用此语法在并行和串行执行之间进行切换。

使用此语法,要并行地执行迭代,您必须有一个并行的工作者池。默认情况下,如果执行parfor,您自动在默认群集配置文件定义的群集中创建并行工人池。默认群集是当地的.您可以更改群集并行偏好.有关更多详细信息,请参阅指定您的并行偏好

parfor (loopVarinitValendval.选择);语句;结束使用选择指定在评估中使用的资源语句在循环体中。创建一套parfor选择使用parforOptions函数。通过这种方法,您可以运行parfor在群集中而无需首先创建并行池并控制方式parfor将迭代分区为工人的子范围。

例子

parfor (loopVarinitValendval.);语句;结束执行语句工人在不创建并行池。这相当于执行parfor (loopVar = initVal:endVal,parforOptions(cluster));语句;结束

例子

全部折叠

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

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

Tic n = 200;一个= 500;一个= 0 (1,n);i = 1:n a(i) = max(abs(eig(rand(a))));结束TOC.

运行脚本,并记录运行时间。

运行时间为31.935373秒。

在脚本中,替换- 与A.parfor循环。

Tic n = 200;一个= 500;一个= 0 (1,n);parfori = 1:n a(i) = max(abs(eig(rand(a))));结束TOC.

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

默认情况下,Matlab会自动打开本地计算机上的并行工人池。

运行时间为10.760068秒。

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

可以指定工人的最大数量对于一个parfor循环。放M = 0在桌面MATLAB中运行循环体,不使用worker,即使池是打开的。当M = 0, MATLAB仍然以不确定的顺序执行循环体,但不是并行的,以便您可以检查您的parfor-循环是独立的,适合在工人上运行。这是允许您调试parfor循环。您无法直接在身体中设置断点parfor的函数体中调用的函数中可以设置断点parfor循环。

指定M = 0奔跑的身体parfor-循环,即使池是打开的。

m = 0;%m指定最大工作人员数量y = 1 (1100);parfor(i = 1:100,m)y(i)= i;结束

要控制平行池中的工人数量,请参阅指定您的并行偏好parpool

要衡量向当前并行池中的工作人员传输了多少数据,可以添加ticBytes (gcp)tocBytes (gcp)前后parfor循环。使用gcp作为获取当前并行池的参数。

如果仍然有一个,请删除当前的并行池。

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

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

默认情况下,Matlab会自动打开本地计算机上的并行工人池。

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

你可以使用ticBytestocbytes.结果,以检查在并行池中传输给和从工作人员的数据量。在本例中,数据传输量很小。有关parfor循环,看决定什么时候使用parfor将循环转换为循环循环

使用群集对象使用Parcluster.函数,创建一组parfor选择与它。默认情况下,Parcluster.使用默认的群集配置文件。检查MATLAB上的默认配置文件首页标签,in.平行>选择默认集群

cluster = parcluster;

跑步parfor直接在集群中计算,将集群对象作为第二个输入参数传递给parfor

当您使用这种方法时,parfor可以使用集群中所有可用的worker,并且一旦循环完成,workers就可用。如果您的集群不支持并行池,这种方法也很有用。金宝app如果您想控制其他选项,包括迭代的划分,请使用parforOptions

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

使用此语法在大型集群上运行Parcol,而不会使工人长度超过必要的工作者。

输入参数

全部折叠

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

确保你的parfor-loop变量是连续增加整数的。想要更多帮助,请看在ParfoS循环中排除故障

的范围parfor-loop变量不得超过支持的范围。金宝app想要更多帮助,请看避免在循环中溢出

数据类型:单身的||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循环。想要更多帮助,请看将循环转换为循环循环

不窝parfor循环,看嵌套parfor和for循环以及其他parfor需求

并行运行的最大工作数量,指定为非负整数。如果您指定上限,则MATLAB即使正在使用其他工人,也不使用此号码。如果您要求更多的工人比现有工人数量更多,那么Matlab使用呼叫时的最大工作人员数量。如果循环迭代少于工人的数量,则一些工​​人不执行任何工作。

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

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

例子:选择= parforOptions (parcluster);

集群,指定为平行的。集群的对象,parfor运行。要创建群集对象,请使用Parcluster.函数。

例子:集群= parcluster(当地的)

数据类型:平行的。集群

提示

  • 使用一个parfor- 辛:

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

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

  • 不要使用parfor- 循环中的迭代取决于其他迭代的结果时。

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

  • 当你使用时parfor,则必须等待循环完成才能获得结果。您的客户端MATLAB被阻塞,您无法提前跳出循环。如果你想获得中间结果,或者打破循环早期,试试parfeval代替。

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

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

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

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

  • 你可以运行simulin金宝appk®模型与之平行parsim命令代替使用parfor循环。有关并行使用Simulink的更多信息和示例,请参阅金宝app运行多个模拟(金宝app模型)

介绍了R2008a