在并行池工作器上运行函数
时间的函数F
= parfeval (fcn
,numout
,X1,…,Xm
)fcn
运行。MATLAB®如果on可用,则使用并行池运行函数。否则,它以串行方式运行函数。
您可以与没有parallel Computing Toolbox™的MATLAB用户共享使用此语法的并行代码。
MATLAB对函数进行计算fcn
异步是(日元…,Yn)=Xm fcn (X1,…)
,米
输入和n
输出。
MATLAB返回未来
对象F
之前的函数fcn
完成运行。您可以使用fetchOutputs
检索结果(日元…,Yn)
从未来。停止运行函数fcn
,可以使用取消
函数。有关期货的更多信息,请参见未来
.
如果一个并行池是打开的,MATLAB使用该并行池来运行函数fcn
.
如果一个并行池没有打开,并且:
启用自动池创建后,MATLAB使用默认集群配置文件启动并行池,然后使用该并行池运行函数fcn
.默认启用自动创建池。
您可以通过指定来手动强制此行为parpool
作为pool参数池
.
自动池创建被禁用,MATLAB运行该功能fcn
使用延迟执行。
您可以通过指定来手动强制此行为parallel.Pool.empty
作为pool参数池
.
parfeval
期货当你使用parfeval
或parfevalOnAll
要在后台运行计算,需要创建名为futures的对象。你可以使用状态
属性,以确定它是正在运行、排队还是已完成。你也可以用theFevalQueue
属性来访问正在运行的和排队的期货。要取消期货,可以使用取消
函数。在这个例子中,你:
使用取消
直接取消期货。
检查已完成期货的完成错误。
使用FevalQueue
财产访问期货。
将工作添加到队列
创建并行池p
有两个工人。
p = parpool (2);
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:2)。
当你使用parfeval
为了在后台运行计算,该函数为每个计算创建一个future并将其添加到池队列中。任务将一直留在队列中,直到一个worker变为空闲。当一个worker空闲时,如果队列不是空的,它就开始计算一个任务。当一个worker完成一个任务时,该任务将从队列中移除,该worker将变为空闲状态。
使用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正)
是未来的一个极端情况,它会使队列变慢。
直接取消期货
你可以使用状态
取得物业期货的地位。构造每个未来的状态的单元格数组f
.
{f。州}
ans =1×5单元{“奔跑”}{“奔跑”}{“排队”}{“排队”}{“排队”}
每一项任务,除了第三个永远停顿。
取消第二个未来直接用取消
.
取消(f (2));{f。州}
ans =1×5单元{“奔跑”}{'完成'}{“奔跑”}{“排队”}{“排队”}
当你取消了第二个未来,第三个未来就会运行。等待第三个未来完成,然后再次检查状态。
等待(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
和QueuedFutures
.的RunningFutures
属性是与当前正在运行的任务对应的期货数组。
disp (p.FevalQueue.RunningFutures)
1 x2 FevalFuture数组:ID状态FinishDateTime功能错误 -------------------------------------------------------- 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。州}
ans =1×5单元{“奔跑”}{'完成'}{'完成'}{“奔跑”}{'完成'}
RunningFutures
和QueuedFutures
是从最新到最老的排序,不管是否f
按最新到最老的顺序排列。每个未来都是独一无二的ID
属性的值。检查ID
每个期货的财产f
.
disp (f)
1x5 FevalFuture array: ID State FinishDateTime Function Error -------------------------------------------------------------- 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
将结果与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 = 3
在这里,RunningFutures
是一个数组,包含f (1)
和f (4)
.如果你取消RunningFutures (2)
,你取消了第四个未来f (4)
.
有时候,future在工作空间中是不可用的,例如,如果您在同一段代码完成之前执行两次,或者如果您使用parfeval
在一个函数。您可以取消工作区中不可用的期货。
清晰的f
从工作空间。
清晰的f
您可以使用RunningFutures
和QueuedFutures
去访问尚未完成的期货。使用RunningFutures
取消f (4)
.
rf2 = p.FevalQueue.RunningFutures (2);取消(rf2) rf2。状态
ans = '完成'
要取消队列中仍然存在的所有期货,请使用以下代码。
取消(p.FevalQueue.QueuedFutures);取消(p.FevalQueue.RunningFutures);
使用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 [completedIdx,value] = fetchNext(f);magicResults {completedIdx} =价值;流(' 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网格meshgrid
函数。
(ρ,σ)= meshgrid(ρ,σ);
创建一个图形对象,并设置“可见”
来真正的
这样它就会在活动脚本之外的新窗口中打开。要可视化参数扫描的结果,创建一个表面图。注意,初始化Z
表面的分量南
创建一个空的情节。
图(“可见”,真正的);表面=冲浪(ρ,σ,南(大小(σ)));包含(‘\ρ,“翻译”,“泰克斯”) ylabel (‘\σ’,“翻译”,“泰克斯”)
设置并行环境
方法创建一个并行工作器池parpool
函数。
parpool;
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:6)。
要从工人发送数据,创建一个DataQueue
对象。方法设置一个函数,在每次工作者发送数据时更新表面图afterEach
函数。的updatePlot
Function是在示例的最万博1manbetx后定义的一个支持函数。
Q = parallel.pool.DataQueue;afterEach (Q, @(数据)updatePlot(表面、数据));
执行并行参数扫描
定义参数后,可以执行并行参数扫描。
parfeval
当您分配工作负载时工作更有效。要分发工作负载,请将参数分组到分区中进行研究。对于本例,将其划分为大小一致的分区一步
通过使用冒号操作符(:
).由此产生的数组分区
包含分区的边界。注意,必须添加最后一个分区的端点。
一步= 100;Partitions = [1:step:numel(sigma), numel(sigma)+1]
分区=1×171101 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,所以你可以继续工作,而计算发生。工人并行计算并将中间结果通过DataQueue
一旦它们可用。
如果你想阻塞MATLAB直到parfeval
完成后,使用等待
函数用于将来对象。使用等待
函数在后续代码依赖于完成时非常有用parfeval
.
等待(f);
后parfeval
完成计算,等待
完成后,您可以执行更多的代码。例如,绘制结果曲面的轮廓。使用fetchOutputs
函数检索存储在未来对象中的结果。
结果=重塑(fetchOutputs (f), gridSize, []);contourf(ρ,σ,结果)包含(‘\ρ,“翻译”,“泰克斯”) ylabel (‘\σ’,“翻译”,“泰克斯”)
如果参数扫描需要更多计算资源,并且可以访问集群,则可以扩展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”);结束
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
在每个future完成后,计算每个输出数组中的最大值。
maxFuture = afterEach (f @max 1);
你可以使用状态
取得物业期货的地位。创建一个逻辑阵列状态
财产的期货f
是“完成”
.使用的意思是
计算已完成期货的比例。然后,创建一个匿名函数updateWaitbar
.函数改变的小数等待条长度h
到成品期货的一部分。
updateWaitbar = @(~) waitbar(mean({f。州}= =“完成”), h);
使用afterEach
和updateWaitbar
在每个未来的in之后更新小数等待条长度maxFuture
完成。使用毕竟
和删除
在所有计算完成后关闭等待栏。
updateWaitbarFutures = afterEach (f updateWaitbar 0);毕竟(updateWaitbarFutures @(~)删除(h), 0);
使用毕竟
和柱状图
显示结果的直方图maxFuture
在所有的未来完成之后。
showsHistogramFuture =毕竟(maxFuture @histogram 0);
fcn
- - - - - -函数来运行在worker上执行的函数,指定为函数句柄。
例子:fcn = @sum
数据类型:function_handle
numout
- - - - - -输出参数个数输出参数的数量,指定为非负整数标量。
n
是否运行时期望输出参数的数量Xm fcn (X1,…)
.
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
X1,…,Xm
- - - - - -输入参数输入参数,指定为逗号分隔的变量或表达式列表。
池
- - - - - -池平行的。池
对象F
——未来平行的。FevalFuture
对象未来,作为一个平行的。FevalFuture
对象。
使用fetchOutputs
或fetchNext
检索结果F
.
使用注意事项及限制:
的语法parfeval (fcn n, X1,…,Xm)
如果您有并行计算工具箱,则具有自动并行支持。万博1manbetx
有关更多信息,请参见运行MATLAB函数与自动并行支持万博1manbetx.
backgroundPool
或使用并行计算工具箱™加速代码ThreadPool
.这个函数完全支持基于线程的环境。万博1manbetx有关更多信息,请参见在线程环境中运行MATLAB函数.
parfeval
|取消
|ticBytes
|tocBytes
|afterEach
|毕竟
|fetchNext
|fetchOutputs
|parallel.pool.Constant
|parfevalOnAll
|parpool
|等待
|未来
有一个对应于MATLAB的代码:
把它扔进introduciéndolo然后把它扔进MATLAB。Los navegadores web no admit comandos de MATLAB。
你也可以从以下列表中选择一个网站:
选择中国网站(中文或英文)以获得最佳网站性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。