主要内容

parfeval

在并行池工作器上异步执行函数

描述

例子

F= Parfeval(pFCN.numout三机一体,in2,…请求异步执行该函数FCN.在并行池中包含的工人p,希望numout输出参数和作为输入参数提供三机一体,in2,….的异步计算FCN.不阻止matlab。F是A.平行的。FevalFuture对象,当工作人员完成评估时,可从中获得结果FCN..的评价FCN.除非您通过调用明确地取消执行,否则始终进行取消(f).要请求多个函数求值,必须调用parfeval多次。(然而,Parfevalonall.可以在所有工人上运行相同的功能。)

例子

F= Parfeval(FCN.numout三机一体,in2,…请求在当前并行池上异步执行。如果不存在池,它将启动一个新的并行池,除非您的并行首选项禁用了池的自动创建。

例子

全部折叠

当你使用parfevalParfevalonall.要在后台运行计算,需要创建名为futures的对象。你可以使用状态属性,以确定它是正在运行、排队还是已完成。你也可以用theFevalQueue属性来访问正在运行的和排队的期货。要取消期货,可以使用取消函数。在这个例子中,你:

  • 使用取消直接取消期货。

  • 检查已完成期货的完成错误。

  • 使用FevalQueue财产获取期货。

将工作添加到队列

创建并行池p有两个工人。

p = parpool (2);
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:2)。

当你使用parfeval要在后台运行计算,该函数将为池队列创建并增加每个计算的将来。任务留在队列中,直到工人变得空闲。当工人变得空闲时,如果队列不为空,则开始计算任务。当工人完成任务时,任务从队列中删除,工作人员变得空闲。

使用parfeval创建一个期货数组f通过指示工人执行功能暂停.使用1第三个未来,和一个论点为了所有其他的未来。

n = 1:5如果n == 3 f(n)= parfeval(@ pause,0,1);其他的f (n) = parfeval (@pause 0正);结束结束

每次使用parfeval返回一个future对象,该对象表示函数在worker上的执行。除了第三个未来,每个未来都需要无限长的时间来计算。未来由Parfeval(@ Pause,0,Inf)是未来的一个极端情况,它会使队列变慢。

直接取消期货

你可以使用状态取得物业期货的地位。构造每个未来的状态的单元格数组f

{f。州}
ans =1×5个细胞{“奔跑”}{“奔跑”}{“排队”}{“排队”}{“排队”}

每一项任务,除了第三个永远停顿。

取消第二个未来直接用取消

取消(f (2));{f。州}
ans =1×5个细胞{'正在运行'} {'完成'} {'运行'} {'排队'} {'queed'}

当你取消了第二个未来,第三个未来就会运行。等待第三个未来完成,然后再次检查状态。

等待(f (3));{f。州}
ans =1×5个细胞{“奔跑”}{'完成'}{'完成'}{“奔跑”}{“排队”}

第三个未来现在有国家“完成”

检查完成错误

当未来完成时,它状态财产成为“完成”.区分被取消并正常完成的期货,使用错误财产。

流(“f (2): % s \ n”f (2) .Error.message)
f(2):取消对未来的执行。
流(“f (3): % s \ n”f (3) .Error.message)
f (3):

如message属性所示,代码取消了第二个future。第二个未来被取消了,正如消息财产。第三个future完成时没有错误,因此没有错误消息。

取消池队列中的期货

你可以使用FevalQueue属性访问池队列中的期货。

P.Fevalqueue.
ans = FevalQueue,具有属性:编号排队:1编号运行:2

队列有两个属性:RunningFutures排队义务.的RunningFutures属性是与当前正在运行的任务对应的期货数组。

disp (p.FevalQueue.RunningFutures)
1 x2 FevalFuture数组:ID状态FinishDateTime功能错误  -------------------------------------------------------- 1 12运行@pause 2 15 @pause运行

排队义务属性是与当前排队且未运行的任务对应的期货数组。

disp(p.fevalqueue.queduedfutures)
FevalFuture with properties: ID: 16 Function: @pause CreateDateTime: 15- jule2020 17:29:37 StartDateTime: Running Duration: 0 days 0h 0m 0s状态:queued Error: none

您可以取消单个期货或一组期货。取消所有的期货排队义务

取消(p.FevalQueue.QueuedFutures);{f。州}
ans =1×5个细胞{“奔跑”}{'完成'}{'完成'}{“奔跑”}{'完成'}

RunningFutures排队义务无论是f是从最新到最古老的。每个未来都有一个独特的ID客户终身的财产。检查ID每个期货的财产f

DISP(F)
1x5 FevalFuture array: ID State FinishDateTime Function Error -------------------------------------------------------------- 1 12 running @pause 2 13 finished (unread) 15- jul-2020 17:29:37 @pause Error 3 14 finished (unread) 15- jul-2020 17:29:39 @pause 4 15 running @pause 5 16 finished (unread) 15- jul-2020 17:29:39 @pause Error

将结果与ID性质RunningFutures

j = 1:length(p.FevalQueue.RunningFutures) rf = p.FevalQueue.RunningFutures(j);流("p.FevalQueue.RunningFutures(%i): ID = %i\n"、j rf.ID)结束
P.Fevalqueue.RunningFutures(1):ID = 12 P.Fevalqueue.RunningFutures(2):ID = 15

在这里,RunningFutures是一个数组,包含f (1)F(4).如果你取消奔跑(2),你取消了第四个未来F(4)

有时候,future在工作空间中是不可用的,例如,如果您在同一段代码完成之前执行两次,或者如果您使用parfeval在一个函数中。您可以取消工作空间中不可用的期货。

清晰的f从工作区。

清晰的f

您可以使用RunningFutures排队义务访问尚未完成的期货。使用RunningFutures取消F(4)

rf2 = p.FevalQueue.RunningFutures (2);取消(rf2) rf2。状态
ans ='完成'

要取消仍在队列中的所有期货,请使用以下代码。

取消([p.FevalQueue。RunningFuturesP.Fevalqueue..排队义务])

使用parfeval请求在一个工作器上异步执行一个函数。

例如,向并行池提交一个请求。使用fetchOutputs

f = parfeval (@magic 1 10);值= fetchOutputs (f);

您也可以提交一个向量的多个未来的请求-循环并在结果可用时收集它们。为了提高效率,在前面预先分配一个未来对象数组。

f (1:10) = parallel.FevalFuture;f(Idx) = parfeval(@magic,1, Idx);结束

使用fetchnext.

magicResults =单元(10);IDX = 1:10 [BREINGSIDIDX,VALUE] = fetchnext(f);MagicResults {stripendidx} =值;流('索引得到结果:%d。\ n', completedIdx);结束

这个示例演示了如何执行并行参数扫描parfeval并在计算过程中返回结果达图对象。parfeval不会阻塞MATLAB,所以你可以继续工作,而计算发生。

该示例在常微分方程的Lorenz系统上执行参数扫描,参数 σ ρ ,并显示了该系统的混沌性质。

d d t x σ y - z d d t y x ρ - z - y d d t z XY - β x

创建参数网格

定义要在参数扫描中探索的参数范围。

gridsize = 40;sigma = linspace(5,45,gridsize);rho = linspace(50,100,gridsize);Beta = 8/3;

创建参数的2-D网格meshgrid函数。

(ρ,σ)= meshgrid(ρ,σ);

创建一个图形对象,并设置“可见”真正的这样它就会在活动脚本之外的新窗口中打开。要可视化参数扫描的结果,创建一个表面图。注意,初始化Z表面的分量创建一个空的情节。

图(“可见”,真的);表面=冲浪(Rho,Sigma,NaN(尺寸(sigma)));Xlabel('\ rho'“翻译”“泰克斯”) ylabel (‘\σ’“翻译”“泰克斯”

设置并行环境

通过使用使用的创建平行工人池parpool函数。

parpool;
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:6)。

要从工人发送数据,创建一个达图对象。方法设置一个函数,在每次工作者发送数据时更新表面图afterEach函数。的updateplot.Function是在示例的最万博1manbetx后定义的一个支持函数。

q = parallel.pool.dataqueue;extereAp(Q,@(数据)updateplot(表面,数据));

执行并行参数扫描

定义参数后,可以执行并行参数扫描。

parfeval在分发工作负载时更有效地工作。要分发工作负载,请将参数进行分组以探索分区。对于此示例,分为大小的均匀分区通过使用冒号操作符().由此产生的数组分区包含分区的边界。请注意,您必须添加最后一个分区的结束点。

一步= 100;Partitions = [1:step:numel(sigma), numel(sigma)+1]
分区=1×17.1101 201 301 401 501 601 701 801 901 1001 1101 1201 1301 1401 1501 1601

为了获得最佳性能,请尝试将分区划分为:

  • 与调度分区的开销相比,计算时间非常大。

  • 足够小,有足够的分区让所有工作人员忙碌。

要表示并行工作器上的函数执行并保存它们的结果,请使用future对象。

f(1:元素个数(分区)1)= parallel.FevalFuture;

将计算卸载给并行工作人员parfeval函数。parameterSweep是在本脚本末尾定义的一个帮助函数,它解决Lorenz系统对要研究的参数划分的问题。它有一个输出参数,因此必须指定1作为输出的数量parfeval

f(ii) = parfeval(@parameterSweep,1,partitions(ii),partitions(ii+1),sigma,rho,beta,Q);结束

parfeval不会阻塞MATLAB,所以你可以继续工作,而计算发生。工人并行计算并将中间结果通过达图一旦他们可用。

如果你想阻塞MATLAB直到parfeval完成,使用等待函数用于将来对象。使用等待当后续代码取决于完成时,功能很有用parfeval

等待(f);

parfeval完成计算,等待完成,您可以执行更多代码。例如,绘制所得表面的轮廓。使用fetchOutputs函数检索存储在未来对象中的结果。

结果=重塑(fetchOutputs (f), gridSize, []);contourf(ρ,σ,结果)包含('\ rho'“翻译”“泰克斯”) ylabel (‘\σ’“翻译”“泰克斯”

如果参数扫描需要更多计算资源,并且可以访问集群,则可以扩展parfeval计算。有关更多信息,请参见从桌面扩展到集群

定义辅助函数

定义一个辅助函数,用于解决Lorenz系统上的参数划分。将中间结果发送到MATLAB客户端发送功能上的达图对象。

函数result = parameterSweep(first,last,sigma,rho,beta,Q)II =首先:Last-1 LorenzSystem = @(t,a)[sigma(ii)*(a(2) -  a(1));a(1)*(rho(ii) -  a(3)) -  a(2);a(1)* a(2) -  beta * a(3)];[t,a] = ode45(lorenzsystem,[0 100],[1 1 1]);结果= a(结束,3);发送(Q,[II,结果]);结果(II-First + 1)=结果;结束结束

定义另一个辅助函数,在新数据到达时更新曲面图。

函数updateplot(曲面,数据)surface.zdata(数据(1))=数据(2);rawingow(“limitrate”);结束

这个例子展示了如何在计算完成后更新用户界面。当你将计算卸载给使用parfeval,当工作人员执行这些计算时,所有用户界面都是响应的。在本例中,使用waitbar创建一个简单的用户界面。

  • 使用afterEach在每次计算完成后更新用户界面。

  • 使用毕竟在所有计算完成后更新用户界面。

使用waitbar要创建图形句柄,h.当你使用afterEach毕竟,waitbar函数更新图形句柄。有关句柄对象的更多信息,请参见处理对象的行为

h = waitbar (0,'等待...');

使用parfeval计算随机矩阵特征值的实部。默认首选项,parfeval如果尚未创建一个,则会自动创建并行池。

idx = 1:100 f(idx)= parfeval(@(n)real(eig(randn(n))),1,5e2);结束

您可以使用afterEach自动调用每个结果上的功能parfeval计算。使用afterEach在每个future完成后,计算每个输出数组中的最大值。

maxFuture = afterEach (f @max 1);

你可以使用状态取得物业期货的地位。创建一个逻辑阵列状态财产的期货f“完成”.使用的意思是计算已完成期货的比例。然后,创建一个匿名函数updateWaitbar.函数改变的小数等待条长度h到成品期货的一部分。

updateWaitbar = @(~) waitbar(mean({f。州}= =“完成”), h);

使用afterEachupdateWaitbar在每个未来的in之后更新小数等待条长度MaxFuture.完成。使用毕竟删除在所有计算完成后关闭等待栏。

updateWaitbarFutures = afterEach (f updateWaitbar 0);毕竟(updateWaitbarFutures @(~)删除(h), 0);

使用毕竟柱状图显示结果的直方图MaxFuture.毕竟期货完成。

showsHistogramFuture =毕竟(maxFuture @histogram 0);

输入参数

全部折叠

并行工作程序池,指定为平行的。池对象。的方法可以创建并行池parpool函数。

数据类型:平行的。池

在工作者上执行的函数,指定为函数句柄。

例子:fcn = @sum.

数据类型:function_handle

预期输出参数的数量FCN.

数据类型:单身的|双倍的|int8|int16|INT32.|INT64.|uint8.|uint16|UINT32|uint64

要传递给的函数参数FCN.,指定为逗号分隔的变量或表达式列表。

输出参数

全部折叠

未来的对象,作为一个返回平行的。FevalFuture,表示执行FCN.并保存它的结果。使用fetchOutputsfetchnext.收集结果。

介绍了R2013b