主要内容

parfeval

在并行运行功能池工人

描述

例子

F= parfeval (fcn,numout,X1,…, Xm)时间的函数fcn运行。MATLAB®运行函数使用一个平行池如果一个是可用的。否则,它运行在连续函数。

你可以分享你的并行代码使用这个语法与MATLAB的用户没有并行计算工具箱™。

MATLAB计算函数fcn异步是(日元…,Yn)=Xm fcn (X1,…),输入和n输出。

MATLAB返回未来对象F之前的函数fcn完成运行。您可以使用fetchOutputs检索结果(日元…,Yn)从未来。停止运行的函数fcn,可以使用取消函数。关于期货的更多信息,请参阅未来

如果平行池开放,MATLAB使用并行池运行功能fcn

如果一个平行池并不开放:

  • 启用自动池创建,MATLAB开始集群并行池使用默认配置文件,然后使用并行池运行功能fcn。自动池创建默认情况下是启用的。

    你可以通过指定手动力这一行为parpool作为连接池参数

  • 禁用自动池创建,MATLAB运行功能fcn使用延迟执行。

    你可以通过指定手动力这一行为parallel.Pool.empty作为连接池参数

例子

F= parfeval (,fcn,numout,X1,…, Xm)时间的函数fcn使用池运行。当你需要使用这个语法在运行时指定一个池。

在后台运行代码,请参阅parfeval

例子

全部折叠

当你使用parfevalparfevalOnAll要运行在后台计算,您创建对象称为期货。您可以使用状态房地产未来的发现是否正在运行,排队或完成。您还可以使用FevalQueue属性的一个平行池访问运行和排队期货。取消期货,你可以使用取消函数。在本例中,您:

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

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

  • 使用FevalQueue属性访问期货。

添加工作队列

创建一个平行的池p有两个工人。

p = parpool (2);
开始平行池(parpool)使用过程的概要文件…连接到平行池(工人数量:2)。

当你使用parfeval运行在后台计算,每个计算的函数创建和添加一个未来到池队列。任务仍然在队列中,直到一个工人变得空闲。当一个工人变为空闲时,它开始计算任务如果队列非空。当一个工人完成一个任务,任务从队列中移除和工人闲置了。

使用parfeval创建一个数组的期货f指导工人执行函数暂停。使用一个参数1第三的未来,一个论点对于所有其他期货。

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

每次使用parfeval返回一个未来对象表示一个函数的执行一个工人。除了第三个未来,未来的每一个需要无限的时间来计算。创造的未来parfeval (@pause 0正)未来的是一个极端的例子可以减缓队列。

直接取消期货

您可以使用状态财产获得期货的状态。构造一个单元阵列的每一个未来的状态f

{f.State}
ans =1×5单元{“奔跑”}{“奔跑”}{“排队”}{“排队”}{“排队”}

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

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

取消(f (2));{f.State}
ans =1×5单元{“奔跑”}{'完成'}{“奔跑”}{“排队”}{“排队”}

取消第二个未来之后,第三个未来的运行。等到第三个未来完成,然后再次检查状态。

等待(f (3));{f.State}
ans =1×5单元{“奔跑”}{'完成'}{'完成'}{“奔跑”}{“排队”}

第三个未来现在状态“完成”

检查完成错误

将来完成时,其状态房地产成为“完成”。区分期货通常是取消,完整的使用错误财产。

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

代码取消第二个未来,因为消息属性表示。第二个未来被取消,如上所述消息财产。第三个未来完成没有错误,因此没有一个错误消息。

取消期货池队列

您可以使用FevalQueue属性访问期货池队列。

p.FevalQueue
ans = FevalQueue属性:排队数量:1运行数量:2

队列有两个属性:RunningFuturesQueuedFutures。的RunningFutures属性是一个数组的期货对应于当前正在运行的任务。

disp (p.FevalQueue.RunningFutures)
1 x2 FevalFuture数组:ID状态FinishDateTime函数错误- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 3运行@pause 2 6 @pause运行

QueuedFutures期货相应任务的属性是一个数组,目前排队而不是跑步。

disp (p.FevalQueue.QueuedFutures)
FevalFuture属性:ID: 7功能:@pause CreateDateTime: 08 - mar - 2021 10:03:13 StartDateTime: RunningDuration: 0天0 h 0 m 0状态:排队错误:没有

你可以取消一个未来或期货的数组。取消所有的期货QueuedFutures

取消(p.FevalQueue.QueuedFutures);{f.State}
ans =1×5单元{“奔跑”}{'完成'}{'完成'}{“奔跑”}{'完成'}

RunningFuturesQueuedFutures排序从最新到最古老的,不管吗f是为了从最新的古老。每个未来都有一个独一无二的ID房地产客户的生命周期。检查ID每个期货的属性f

disp (f)
1 x5 FevalFuture数组:ID状态FinishDateTime函数错误- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 3运行@pause 2 4完成(未读)08 - mar - 2021 10:03:20 @pause错误3 5完成(未读)08 - mar - 2021 10:03:21 @pause 4 6运行@pause 5 7完成(未读)08 - mar - 2021 10:03:22 @pause错误

对比较结果ID每一个的属性RunningFutures

j = 1:长度(p.FevalQueue.RunningFutures)射频= p.FevalQueue.RunningFutures (j);流(“p.FevalQueue.RunningFutures (%): ID = % \ n”、j rf.ID)结束
p.FevalQueue.RunningFutures (1): ID = 3 p.FevalQueue.RunningFutures (2): ID = 6

在这里,RunningFutures是一个数组,其中包含f (1)f (4)。如果你取消RunningFutures (2)未来,你取消第四f (4)

有时,期货不是在工作区中可用,例如,如果执行同一段代码两次在它结束之前,或者如果你使用parfeval在一个函数。你可以取消期货在工作区中不可用。

清晰的f从工作空间。

清晰的f

您可以使用RunningFuturesQueuedFutures访问期货尚未完成。使用RunningFutures取消f (4)

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

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

取消(p.FevalQueue.QueuedFutures);取消(p.FevalQueue.RunningFutures);

使用parfeval请求的异步执行一个函数在一个工人。

例如,提交一个请求并行池。通过使用检索输出fetchOutputs

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

你也可以提交多个未来请求的一个向量循环和收集结果。为了提高效率,preallocate未来对象的数组。

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

未来检索单个输出可用时使用fetchNext

magicResults =单元(10);idx = 1:10 [completedIdx、价值]= fetchNext (f);magicResults {completedIdx} =价值;流(得到结果与指数:% d。\ n”,completedIdx);结束

这个例子展示了如何执行一个平行的参数扫描parfeval在计算,并发送结果DataQueue对象。

parfeval不阻止MATLAB,所以你可以继续工作,而计算。

示例执行参数扫描对洛伦兹系统的常微分方程,在参数 σ ρ ,显示该系统的混沌特性。

d d t x = σ ( y - - - - - - z ) d d t y = x ( ρ - - - - - - z ) - - - - - - y d d t z = xy - - - - - - β x

创建参数网格

定义参数的范围,你想探索在参数扫描。

gridSize = 40;σ= linspace (5 45 gridSize);gridSizeρ= linspace (100);β= 8/3;

创建一个二维网格的参数使用meshgrid函数。

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

创建一个图对象,并设置“可见”真正的在新窗口中打开,生活之外的脚本。可视化的结果参数扫描,创建一个曲面图。注意,初始化Z组件的表面创建一个空的阴谋。

图(“可见”,真正的);表面=冲浪(ρ,σ,南(大小(σ)));包含(‘\ρ,“翻译”,“泰克斯”)ylabel (‘\σ’,“翻译”,“泰克斯”)

设置并行环境

创建一个池的平行工人使用parpool函数。

parpool;
开始平行池(parpool)使用过程的概要文件…连接到平行池(工人数量:6)。

从工人发送数据,创建一个DataQueue对象。建立一个函数,每次更新曲面图一个工人发送数据使用afterEach函数。的updatePlot函数是一个支持函数定义的例子金宝app。

Q = parallel.pool.DataQueue;afterEach (Q, @(数据)updatePlot(表面、数据));

并行执行参数扫描

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

parfeval工作更有效地分布工作负载。分发工作负载,集团探索到分区的参数。对于本例,分成均匀的分区大小一步通过使用冒号运算符(:)。由此产生的数组分区包含分区的边界。请注意,您必须添加最后一个分区的终点。

一步= 100;分区=[1:步骤:元素个数(σ),元素个数(σ)+ 1]
分区=1×171 101 201 301 401 501 601 701 801 901 1001 1101 1201 1301 1401 1501 1601

为获得最佳性能,尝试分成的分区:

  • 足够大,计算时间很大的开销相比调度分区。

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

代表函数执行并行工人和持有他们的结果,使用未来的对象。

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

卸载计算并行工人使用parfeval函数。parameterSweep最后一个helper函数定义的脚本,解决了洛伦兹系统分区参数的探索。它有一个输出参数,所以你必须指定1输出的数量parfeval

2 = 1:元素个数(分区)1 f (2) = parfeval (@parameterSweep 1(2)分区,分区(2 + 1),σ,ρ,β,Q);结束

parfeval不阻止MATLAB,所以你可以继续工作,而计算。工人们,把中间结果通过并行计算DataQueue一旦他们成为可用。

如果你想阻止MATLAB直到parfeval完成后,使用等待函数对未来对象。使用等待函数非常有用当后续代码取决于完成parfeval

等待(f);

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

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

如果你的参数扫描需要更多的计算资源,你可以访问一个集群,你可以扩大你的parfeval计算。有关更多信息,请参见从桌面到集群规模

定义辅助函数

定义一个helper函数,解决了洛伦兹系统分区参数的探索。将中间结果发送到客户机通过使用MATLAB发送功能上的DataQueue对象。

函数结果= parameterSweep(首先,最后,σ,ρ,β,Q)结果= 0 (last-first, 1);2 =第一:持续1 lorenzSystem = @ (t))(σ(ii) * ((2) - (1));(1)*(ρ(2)- (3)),(2);(1)*(2)-β* (3)];[t] =数值(lorenzSystem, 100年[0],[1 1 1]);结果=(结束,3);发送(Q, [ii,结果]);结果(ii-first + 1) =结果;结束结束

定义另一个helper函数,更新新的数据到达时曲面图。

函数updatePlot(表面数据)surface.ZData(数据(1))=数据(2);drawnow (“limitrate”);结束

这个例子展示了如何更新用户界面计算完成。当你卸下计算工人使用parfeval,所有用户界面响应,而工人执行这些计算。在本例中,您使用waitbar创建一个简单的用户界面。

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

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

使用waitbar要创建一个图处理,h。当你使用afterEach毕竟,waitbar图处理功能更新。关于处理对象的更多信息,请参阅处理对象的行为

h = waitbar (0,“等……”);

waitbar.png

使用parfeval计算随机矩阵的特征值的实部。默认首选项,parfeval创建一个平行池自动如果不是已经创建。

idx = 1:10 0 f (idx) = parfeval (@ (n)真实(eig (randn (n))), 1、5 e2);结束

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

maxFuture = afterEach (f @max 1);

您可以使用状态财产获得期货的状态。创建一个逻辑数组的地方状态房地产的期货f“完成”。使用的意思是计算完成期货的分数。然后,创建一个匿名函数updateWaitbar。函数部分等栏的长度变化h的分数完成期货。

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

使用afterEachupdateWaitbar更新后的分数等杆长每一个未来maxFuture完成。使用毕竟删除关闭后等待酒吧所有的计算都是完整的。

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

使用毕竟柱状图显示结果的柱状图maxFuture毕竟期货完成。

showsHistogramFuture =毕竟(maxFuture @histogram 0);

输入参数

全部折叠

函数来执行一个工人,指定为一个函数处理。

例子:fcn = @sum

数据类型:function_handle

输出参数,指定为一个非负整数标量。

n输出参数的数量预计运行吗Xm fcn (X1,…)

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

输入参数,指定为一个以逗号分隔的变量或表达式。

池,指定为一个parallel.Pool对象。

例子:parpool(“本地”);

例子:backgroundPool;

输出参数

全部折叠

未来,作为一个返回parallel.FevalFuture对象。

扩展功能

版本历史

介绍了R2013b

全部展开