在并行池工作者上运行功能
安排该功能F
= parfeval (fcn
那numout.
那X1,…,Xm
)fcn
运行。MATLAB®如果可用,则使用并行池运行该函数。否则,它在串行中运行该函数。
您可以与没有parallel Computing Toolbox™的MATLAB用户共享使用此语法的并行代码。
MATLAB评估函数fcn
异步作为(日元…,Yn)=fcn(X1,…,Xm)
具有m
输入和N
输出。
MATLAB返回未来
目的F
函数之前fcn
完成运行。你可以用获取输出
检索结果(日元…,Yn)
从未来。停止运行该功能fcn
, 使用取消
函数。有关期货的更多信息,请参见未来
.
如果并行池是打开的,MATLAB将使用该并行池运行函数fcn
.
如果一个并行池没有打开,并且:
启用自动池创建后,MATLAB使用默认集群配置文件启动并行池,然后使用该并行池运行函数fcn
. 默认情况下启用自动池创建。
您可以通过指定来手动强制此行为parpool.
作为池争论水池
.
自动池创建被禁用,MATLAB运行该功能fcn
使用延迟执行。
您可以通过指定来手动强制此行为parallel.Pool.empty
作为池争论水池
.
Parfeval.
期货当你使用Parfeval.
或parfevalOnAll
要在后台运行计算,您将创建名为期货的对象。你可以使用状态
未来的财产,以了解它是否正在运行,排队或完成。你也可以使用小队
用于访问正在运行和排队的未来的并行池的属性。要取消期货,您可以使用取消
函数。在这个例子中,你:
用取消
直接取消期货。
检查完成期货完成错误。
使用小队
财产访问期货。
将工作添加到队列
创建一个并行池P.
有两个工人。
p=parpool(2);
使用“本地”配置文件启动并行池(Parpool)连接到并行池(工人数量:2)。
当你使用Parfeval.
为了在后台运行计算,该函数为每个计算创建一个future并将其添加到池队列中。任务将一直留在队列中,直到一个worker变为空闲。当一个worker空闲时,如果队列不是空的,它就开始计算一个任务。当一个worker完成一个任务时,该任务将从队列中移除,该worker将变为空闲状态。
用Parfeval.
创建一个期货数组F
通过指导工人执行功能暂停
. 使用an argument of1
第三个未来,和一个论点正
对于所有其他的未来。
为了n = 1:5如果N == 3 f(N) = parfeval(@pause,0,1);其他的f(n)=parfeval(@pause,0,Inf);终止终止
每次使用Parfeval.
返回一个future对象,该对象表示函数在worker上的执行。除了第三个未来,每个未来都需要无限长的时间来计算。未来由parfeval (@pause 0正)
这是一个极端的情况,未来可能会减慢排队速度。
直接取消期货
你可以使用状态
财产获得期货的地位。构建每个未来状态的单元格阵列F
.
{F.State}
ans=1×5单元{“奔跑”}{“奔跑”}{“排队”}{“排队”}{“排队”}
除第三项任务外,所有任务都会永远暂停。
使用直接取消第二个未来取消
.
取消(f (2));{F.State}
ans=1×5单元{“奔跑”}{'完成'}{“奔跑”}{“排队”}{“排队”}
取消第二个期货后,第三个期货将运行。等待第三个将来完成,然后再次检查状态。
等待(f(3));{f.State}
ans=1×5单元{'running'}{'finished'}{'finished'}{'running'}{'queued'}
第三个未来现在有了国家“完成”
.
检查完成错误
当一个未来完成时,它是状态
房地产成为“完成”
.要区分已取消的期货和正常完成的期货,请使用错误
财产。
fprintf(“f (2): % s \ n”f (2) .Error.message)
F(2):取消了未来的执行。
fprintf(“f(3):%s\n”,f(3)。错误。消息)
f(3):
代码取消了第二个未来,如消息属性所示。第二个未来已取消,如中所述消息
财产。第三个将完成没有错误,因此没有错误消息。
取消池队列中的期货
你可以使用小队
属性访问池队列中的期货。
p.FevalQueue
ans=FevalQueue,属性:已排队数:1正在运行数:2
队列有两个属性:RunningFutures
和QueuedFutures
.这RunningFutures
属性是与当前正在运行的任务对应的一系列期货。
disp (p.FevalQueue.RunningFutures)
1x2 Fevalfuture阵列:ID状态污染函数函数错误---------------------------------------------------- 1 3运行@pause 2 6运行@pause
这QueuedFutures
属性是与当前排队且未运行的任务对应的期货数组。
disp (p.FevalQueue.QueuedFutures)
FevalFuture with properties: ID: 7 Function: @pause CreateDateTime: 08-Mar-2021 10:03:13 StartDateTime: RunningDuration: 0 days 0h 0m 0s状态:queued Error: none
您可以取消一个未来或一系列期货。取消所有期货QueuedFutures
.
取消(p.FevalQueue.QueuedFutures);{f.State}
ans=1×5单元{'running'}{'finished'}{'finished'}{'running'}{'finished'}
RunningFutures
和QueuedFutures
是从最新到最老的排序,不管是否F
按最新到最老的顺序排列。每个未来都是独一无二的身份证件
属性的值。检查身份证件
每个期货的财产F
.
disp (f)
1x5 fevalfuture array:ID状态饰面函数函数错误---------------------------------------------------------- 1 3 running @pause 2 4 finished (unread) 08-Mar-2021 10:03:20 @pause Error 3 5 finished (unread) 08-Mar-2021 10:03:21 @pause 4 6 running @pause 5 7 finished (unread) 08-Mar-2021 10:03:22 @pause Error
将结果与身份证件
每个RunningFutures
.
为了j = 1:length(p.FevalQueue.RunningFutures) rf = p.FevalQueue.RunningFutures(j);fprintf(“p.fevalqueue.runningfutures(%i):ID =%i \ 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.状态
ans = '完成'
要取消队列中仍然存在的所有期货,请使用以下代码。
取消(p.FevalQueue.QueuedFutures);取消(p.FevalQueue.RunningFutures);
用Parfeval.
请求在辅助进程上异步执行函数。
例如,向并行池提交一个请求。使用获取输出
.
f = parfeval(@ magic,1,10);value = fetchOutputs(f);
您还可以在a中提交多个未来请求的向量为了
-循环并收集可用的结果。为了提高效率,请在之前预先分配一个未来对象数组。
f(1:10)=并行.Fevalfuture;为了f(Idx) = parfeval(@magic,1, Idx);终止
通过使用检索单个将来的输出fetchNext
.
MagicResults = Cell(1,10);为了idx = 1:10 [completedIdx,value] = fetchNext(f);magicResults {completedIdx} =价值;fprintf(' result with index: %d.\n', completedIdx);终止
Parfeval.
此示例显示如何执行并行参数扫描Parfeval.
并在计算期间发送结果DataQueue
对象。Parfeval.
不阻止MATLAB,因此您可以在计算发生时继续工作。
该实例对洛伦兹常微分方程组的参数进行了扫描 和 ,显示了这个系统的混乱本质。
创建参数网格
定义要在参数扫描中探索的参数范围。
gridSize = 40;sigma = linspace(5, 45, gridSize);rho = linspace(50, 100, gridSize);β= 8/3;
创建参数的2-D网格网格
函数。
[rho,sigma] = meshgrid(rho,sigma);
创建地物对象,然后设置“可见”
来符合事实的
这样它就会在活动脚本之外的新窗口中打开。要可视化参数扫描的结果,创建一个表面图。注意,初始化Z.
具有楠
创建一个空的绘图。
身材(“可见”,真正的);表面=冲浪(ρ,σ,南(大小(σ)));包含(‘\ρ那“翻译”那“泰克斯”)伊拉贝尔(‘\σ’那“翻译”那“泰克斯”)
建立并行环境
方法创建一个并行工作器池parpool.
函数。
帕尔普;
正在使用“本地”配置文件启动并行池(parpool)。。。已连接到并行池(工作线程数:6)。
要从工人发送数据,创建一个DataQueue
对象。方法设置一个函数,在每次工作者发送数据时更新表面图之后
函数。这updatePlot
功能是在示例结束时定义的支持金宝app功能。
Q = parallel.pool.DataQueue;afterEach (Q, @(数据)updatePlot(表面、数据));
执行并行参数扫描
定义参数后,可以执行并行参数扫描。
Parfeval.
当您分配工作负载时工作更有效。要分发工作负载,请将参数分组到分区中进行研究。对于本例,将其划分为大小一致的分区一步
通过使用冒号算子(:
).由此产生的数组分区
包含分区的边界。注意,必须添加最后一个分区的端点。
步骤=100;分区=[1:步骤:numel(sigma),numel(sigma)+1]
分割=1×171101 201 301 401 501 601 701 801 901 1001 1101 1201 1301 1401 1501 1601
为了获得最佳性能,请尝试拆分为以下分区:
足够大,与调度分区的开销相比,计算时间要大。
足够小,有足够的分区让所有工作人员忙碌。
要在并行工人上表示函数执行并保存结果,请使用未来的对象。
f(1:numel(partitions)-1)=parallel.FevalFuture;
通过使用Parfeval.
函数。parameterSweep
是在此脚本末尾定义的辅助功能,可以在要探索参数的分区上解决LORENZ系统。它有一个输出参数,因此您必须指定1
的输出数Parfeval.
.
为了II = 1:numel(分区)-1 f(ii)= parfeval(@ parameterweew,1,分区(ii),分区(ii + 1),sigma,rho,beta,q);终止
Parfeval.
不阻止MATLAB,因此您可以在计算发生时继续工作。工人并行计算并通过中间结果发送中间结果DataQueue
一旦它们可用。
如果要阻止MATLAB直到Parfeval.
完成后,使用等待
作用于未来对象。使用等待
函数在后续代码依赖于完成时非常有用Parfeval.
.
等待(f);
后Parfeval.
完成计算,等待
完成后,您可以执行更多的代码。例如,绘制结果曲面的轮廓。使用获取输出
函数检索存储在未来对象中的结果。
结果=重塑(FetchOutputs(F),GridSize,[]);Contourf(rho,sigma,结果)xlabel(‘\ρ那“翻译”那“泰克斯”)伊拉贝尔(‘\σ’那“翻译”那“泰克斯”)
如果参数扫描需要更多计算资源,并且可以访问集群,则可以扩展Parfeval.
计算。有关更多信息,请参阅从桌面扩展到群集.
定义辅助函数
定义一个辅助函数,可以在要探索的参数的分区上解决Lorenz系统。使用中间结果将中间结果发送到MATLAB客户端发送
功能上的DataQueue
对象。
作用result = parameterSweep(first,last,sigma,rho,beta,Q)为了2 =第一:持续1 lorenzSystem = @ (t))(σ(ii) * ((2) - (1));A (1)*(rho(ii) - A (3)) - A (2);(1) *(2) -β* (3)];[t,a] = ode45(lorenzSystem,[0 100],[1 1 1]);结果=(结束,3);发送(Q, [ii,结果]);结果(ii-first + 1) =结果;终止终止
定义另一个辅助函数,在新数据到达时更新曲面图。
作用updatePlot(surface,data) surface. zdata (data(1)) = data(2);drawnow ('limitrate');终止
之后
和毕竟
此示例演示如何在计算完成时更新用户界面。当您使用Parfeval.
,所有用户界面都响应于Workers执行这些计算。在此示例中,您使用服务员
创建一个简单的用户界面。
用之后
在每次计算完成后更新用户界面。
用毕竟
在所有计算完成后更新用户界面。
用服务员
要创建图形句柄,H
.当你使用之后
或毕竟
, 这服务员
函数更新图形句柄。有关句柄对象的详细信息,请参阅处理对象行为.
h=waitbar(0,“等……”);
用Parfeval.
计算随机矩阵的特征值的真实部分。带默认首选项,Parfeval.
如果尚未创建并行池,则自动创建并行池。
为了idx = 1:10 0 f (idx) = parfeval (@ (n)真实(eig (randn (n))), 1、5 e2);终止
你可以用之后
的每个结果上自动调用函数Parfeval.
计算。用之后
在每个将来完成后,计算每个输出数组中的最大值。
maxfuture = intereach(f,@ max,1);
你可以使用状态
属性获取未来的状态。创建一个逻辑数组,其中状态
期货财产F
是“完成”
. 使用的意思是
计算完成期货的分数。然后,创建一个匿名函数updatewaitbar.
.函数改变的小数等待条长度H
到完成期货的分数。
updatewaitbar = @(〜)waitbar(均值({f.state} ==“完成”),h);
用之后
和updatewaitbar.
在每个未来的in之后更新小数等待条长度maxFuture
完成。用毕竟
和删去
在完成所有计算后关闭等待栏。
updateWaitbarFutures = afterEach (f updateWaitbar 0);毕竟(updateWaitbarFutures @(~)删除(h), 0);
用毕竟
和柱状图
显示结果的直方图maxFuture
在所有的未来完成之后。
showshistogramfuture = wherwall(maxfuture,@直方图,0);
fcn
-要运行的函数在worker上执行的函数,指定为函数句柄。
例子:fcn = @sum
数据类型:function_handle.
numout.
-输出参数个数输出参数数,指定为非负整数标量。
N
是否运行时期望输出参数的数量fcn(X1,…,Xm)
.
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
X1,…,Xm
-输入参数输入参数,指定为逗号分隔的变量或表达式列表。
水池
-水池平行。游泳池
目的使用注意事项及限制:
语法parfeval (fcn n, X1,…,Xm)
如果您有并行计算工具箱,则具有自动并行支持。金宝app
有关更多信息,请参阅使用自动并行支持运行MATLAB函数金宝app.
backgroundPool
或使用并行计算工具箱™加速代码线程池
.此功能完全支持基于线程的环境。金宝app有关更多信息,请参阅在基于线程的环境中运行MATLAB函数.
Parfeval.
|取消
|ticBytes
|tocBytes
|之后
|毕竟
|fetchNext
|获取输出
|parallel.pool.Constant
|parfevalOnAll
|parpool.
|等待
|未来
Hai fatto clic su un collegamento che corto comando MATLAB:
esegui il comando inserendolo nella finestra di comando matlab。我浏览Web非Spectsano i金宝app Comandi Matlab。
您还可以从以下列表中选择网站:
选择中国网站(以中文或英文)以获取最佳网站性能。其他MathWorks国家网站未优化您的位置。