parfor
这个例子展示了如何并行执行参数扫描,以及在并行计算过程中绘制进度。你可以用DataQueue
在并行池上监视计算过程中的结果。你也可以用aDataQueue
使用并行语言特性,例如parfor
,parfeval
和spmd
。
该示例显示了如何在van der pol振荡器上执行在经典系统上的参数扫描。该系统可以表示为依赖于两个van der POL振荡器参数的一组ODES, 和 :
您可以对这些参数执行并行参数扫描
和
使用一个parfor
循环找出的平均周期
改变它们时。以下动画显示在本地群集中执行此示例。
定义要研究的参数的值范围。创建一个meshgrid来考虑参数的不同组合。
gridSize = 6;mu = linspace(100, 150,网格大小);nu = linspace(0.5, 2,网格大小);[M, N] = meshgrid(μ,ν);
声明一个变量来存储清除的结果。使用南
预先分配,以避免绘制初始曲面。创建一个表面图来可视化每个参数组合的扫描结果。准备标题、标签、限制等设置。
z = nan(尺寸(n));C =冲浪(m,n,z);Xlabel(“\μ值”,'口译员','tex')ylabel(“\ν值”,'口译员','tex') zlabel (“y的平均周期”)视图(137,30)轴([100 150 0.5 2 0 500]);
创建一个DataQueue
将工人发送到客户的中间结果。使用afterEach
函数在客户端中定义一个回调函数,每次worker发送当前结果时更新surface。
D = parallel.pool.DataQueue;D.afterEach (@ (x) updateSurface (c、x));
使用parfor
执行并行参数扫描。指导工人对网格中的每一个参数组合求解系统,并计算平均周期。当worker完成计算时,立即将每个迭代的结果发送回客户机。
parforN = 1:numel(N) [t, y] = solveVdp(M(ii), N(ii));l = islocalmax(y(:, 2));发送(D, [ii的意思(diff (t (l)))));结束
使用“local”配置文件启动并行池(parpool)…已连接到并行池(workers: 6)。
如果您可以访问一个集群,那么就可以扩展计算。要做到这一点,请删除前面的内容parpool
,并使用配置文件为您的较大群集打开一个新的。下面的代码显示了名为的群集配置文件“MyClusterInTheCloud”
。要自己运行这段代码,必须进行替换“MyClusterInTheCloud”
使用群集配置文件的名称。调整工人的数量。该示例显示了4名工人。通过增加网格的大小来增加整体计算的大小。
gridSize = 25;删除(gcp (“nocreate”));parpool (“MyClusterInTheCloud”4);
使用“MyClusterIntheCloud”配置文件启动并行池(PARPool)...连接到并行池(工人数量:4)。
如果在设置集群配置文件之后再次运行参数扫描代码,那么集群中的工作者将计算并在结果可用时将结果发送给MATLAB客户端。下面的动画显示了这个示例在集群中的执行。
创建一个辅助函数来定义方程组,并对其应用求解器。
功能[t, y] = solveVdp(mu, nu) f = @(~,y) [nu*y(2);μ* (1 y (1) ^ 2) * y (2) - y (1)];[t,y] = ode23s(f,[0 20*mu],[2;0]);结束
为数据队列声明一个函数,以使用来自工作人员的结果更新图表。
功能UpdateSurface(s,d)s.zdata(d(1))= d(2);rawingow(“limitrate”);结束