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
作为连接池参数池
。
例子
查询和取消parfeval
期货
当你使用parfeval
或parfevalOnAll
要运行在后台计算,您创建对象称为期货。您可以使用状态
房地产未来的发现是否正在运行,排队或完成。您还可以使用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
队列有两个属性:RunningFutures
和QueuedFutures
。的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单元{“奔跑”}{'完成'}{'完成'}{“奔跑”}{'完成'}
RunningFutures
和QueuedFutures
排序从最新到最古老的,不管吗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
您可以使用RunningFutures
和QueuedFutures
访问期货尚未完成。使用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
这个例子展示了如何执行一个平行的参数扫描parfeval
在计算,并发送结果DataQueue
对象。
parfeval
不阻止MATLAB,所以你可以继续工作,而计算。
示例执行参数扫描对洛伦兹系统的常微分方程,在参数 和 ,显示该系统的混沌特性。
创建参数网格
定义参数的范围,你想探索在参数扫描。
gridSize = 40;σ= linspace (5 45 gridSize);gridSizeρ= linspace (100);β= 8/3;
创建一个二维网格的参数使用meshgrid
函数。
(ρ,σ)= meshgrid(ρ,σ);
创建一个图对象,并设置“可见”
来真正的
在新窗口中打开,生活之外的脚本。可视化的结果参数扫描,创建一个曲面图。注意,初始化Z
组件的表面南
创建一个空的阴谋。
图(“可见”,真正的);表面=冲浪(ρ,σ,南(大小(σ)));包含(‘\ρ,“翻译”,“泰克斯”)ylabel (‘\σ’,“翻译”,“泰克斯”)
设置并行环境
创建一个池的平行工人使用parpool
函数。
parpool;
开始平行池(parpool)使用过程的概要文件…连接到平行池(工人数量:6)。
从工人发送数据,创建一个DataQueue
对象。建立一个函数,每次更新曲面图一个工人发送数据使用afterEach
函数。的updatePlot
函数是一个支持函数定义的例子万博1manbetx。
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”);结束
使用异步更新用户界面afterEach
和毕竟
这个例子展示了如何更新用户界面计算完成。当你卸下计算工人使用parfeval
,所有用户界面响应,而工人执行这些计算。在本例中,您使用waitbar
创建一个简单的用户界面。
使用
afterEach
每次计算完成后更新用户界面。使用
毕竟
计算完成后更新用户界面。
使用waitbar
要创建一个图处理,h
。当你使用afterEach
或毕竟
,waitbar
图处理功能更新。关于处理对象的更多信息,请参阅处理对象的行为。
h = waitbar (0,“等……”);
使用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);
使用afterEach
和updateWaitbar
更新后的分数等杆长每一个未来maxFuture
完成。使用毕竟
和删除
关闭后等待酒吧所有的计算都是完整的。
updateWaitbarFutures = afterEach (f updateWaitbar 0);毕竟(updateWaitbarFutures @(~)删除(h), 0);
使用毕竟
和柱状图
显示结果的柱状图maxFuture
毕竟期货完成。
showsHistogramFuture =毕竟(maxFuture @histogram 0);
输入参数
fcn
- - - - - -函数来运行
函数处理
函数来执行一个工人,指定为一个函数处理。
例子:fcn = @sum
数据类型:function_handle
numout
- - - - - -数量的输出参数
非负整数标量
输出参数,指定为一个非负整数标量。
n
输出参数的数量预计运行吗Xm fcn (X1,…)
。
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
X1,…, Xm
- - - - - -输入参数
以逗号分隔的变量或表达式
输入参数,指定为一个以逗号分隔的变量或表达式。
池
- - - - - -池
parallel.Pool
对象
池,指定为一个parallel.Pool
对象。
创建一个平行池,使用
parpool
。背景池,使用
backgroundPool
。
例子:parpool(“流程”);
例子:backgroundPool;
输出参数
F
——未来
parallel.FevalFuture
对象
未来,作为一个返回parallel.FevalFuture
对象。
使用
fetchOutputs
或fetchNext
检索结果F
。
扩展功能
自动并行支持万博1manbetx
加速代码通过自动运行并行计算使用并行计算工具箱™。
使用笔记和限制:
的语法
parfeval (fcn n, X1,…, Xm)
自动并行支持并行计算工具箱。万博1manbetx
有关更多信息,请参见MATLAB函数自动并行支持运行万博1manbetx。
线程环境
在后台运行代码使用MATLAB®backgroundPool
与并行计算工具箱™或加速代码ThreadPool
。
这个函数完全支持线程的环境。万博1manbetx有关更多信息,请参见MATLAB函数线程环境中运行。
版本历史
介绍了R2013bAbrir比如
这种版本modificada德埃斯特比如。害怕Desea abrir埃斯特比如con sus modificaciones吗?
第一de MATLAB
Ha事实clic en联合国围绕此时一个埃斯特第一de MATLAB:
Ejecute el第一introduciendolo en la ventana de第一de MATLAB。洛杉矶navegadores网络没有admiten第一de MATLAB。
你也可以从下面的列表中选择一个网站:
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。