主要内容

parfor

执行在worker上并行循环迭代

描述

例子

parforloopVarinitval.endVal陈述;结束执行在并行池中的工作人员上并行循环迭代。

马铃薯草®中执行循环体命令陈述的值loopVar之间initval.endValloopVar指定随意增长的整数值的向量。如果您有并行计算工具箱™,则迭代陈述可以在多核计算机或群集上的并行工人的并行池中执行。和A一样在-loop中,可以包含单行或多行陈述

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

parfor不同于传统的- 以下列方式:

  • 循环迭代以不确定的顺序并行执行。这意味着您可能需要修改代码才能使用parfor.想要更多帮助,请看转换for-Loops为parfor-Loops

  • 循环迭代必须是连续的,递增的整数值。

  • 身体的parfor-loop必须是独立的。一个循环迭代不能依赖于先前的迭代,因为迭代以非识别顺序执行。想要更多帮助,请看确保parfor-Loop迭代是独立的

  • 你不能使用parfor循环在另一个parfor循环。想要更多帮助,请看嵌套Parcon和循环和其他议定书

例子

parfor (loopVarinitval.endVal);陈述;结束用途指定并行池中的最大工人数量用于评估陈述在循环体中。必须是一个非负整数。

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

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

parfor (loopVarinitval.endVal选择);陈述;结束用途选择指定用于评估的资源陈述在循环体中。创建一套parfor选择使用parforptions.函数。使用这种方法,您可以运行parfor在集群上,无需首先创建并行池并控制如何创建parfor为工作人员将迭代划分为子范围。

例子

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

例子

全部折叠

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

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

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

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

运行时间为31.935373秒。

在脚本中,替换循环用parfor循环。

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

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

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

运行时间为10.760068秒。

通过转换,你可以加快计算速度循环到一个parfor- 四名工人。您可以通过增加并行池中的工人数量进一步减少经过的时间。有关更多信息,请参阅转换for-Loops为parfor-Loops扩展到群集和云的循环循环

可以指定工人的最大数量为一个parfor循环。集m = 0.在桌面MATLAB中运行循环的主体,即使池是否开放,也不会使用工人。什么时候m = 0., MATLAB仍然以不确定的顺序执行循环体,但不是并行的,以便您可以检查您的parfor- 砍伐是独立的,适合在工人身上运行。这是允许您调试内容的最简单方法parfor循环。控件的主体中不能直接设置断点parfor的函数体中调用的函数中可以设置断点parfor循环。

指定m = 0.运行…的身体parfor-循环,即使池是打开的。

M = 0;% M指定最大工作人员数量Y = =那些(1,100);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(i)= max(abs(eig(rand(a)))))));结束tocbytes(GCP)TOC

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

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

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

你可以使用ticBytestocBytes结果检查并行池中转移到工人和从工人转移的数据量。在此示例中,数据传输很小。有关的更多信息parfor- 看看,参见决定何时使用律程转换for-Loops为parfor-Loops

属性创建集群对象parcluster函数,并创建一组parfor选项。默认情况下,parcluster使用默认的集群配置文件。检查MATLAB上的默认配置文件首页选项卡,在平行线>选择默认集群

集群= parcluster;

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

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

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

使用此语法可以在大型集群上运行parfor,而不会花费超过必要时间的worker。

输入参数

全部折叠

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

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

的范围parfor-loop变量不能超过支持的范围。金宝app想要更多帮助,请看避免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- 看看,参见嵌套Parcon和循环和其他议定书

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

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

parfor选项,指定为aClusterOptions目的。使用parforptions.函数创建一组parfor选项。

例子:选择= ParforOptions(Parcluster);

群集,指定为a并行.CLUSTER.对象,在哪个parfor运行。要创建集群对象,请使用parcluster函数。

例子:cluster = parcluster('local')

数据类型:并行.CLUSTER.

提示

  • 用一个parfor循环时间:

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

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

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

    还原是这个规则的一个例外。一个减少变量累积取决于所有迭代的值,但与迭代顺序无关。有关更多信息,请参阅减少变量

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

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

  • 如果AutoAttachFiles并行池集群配置文件中的属性设置为真正的, MATLAB对parfor循环以确定其执行所需的代码文件,请参阅listautoattachedfiles..然后Matlab会自动将这些文件附加到并行池中,以便工人使用代码。

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

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

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

介绍了R2008a