parfor
这个例子展示了如何在并行计算中执行参数扫描和绘制进程。你可以使用DataQueue
在并行池上进行计算期间监视结果。你也可以用aDataQueue
与并行语言功能,如parfor
,parfeval
和spmd
。
这个例子展示了如何在一个经典的系统,范德堡尔振荡器上执行一个参数扫描。该系统可以表示为一组依赖于两个范德堡尔振荡器参数的ode,和:
您可以对参数执行并行参数扫描和使用一个parfor
求出的平均值当不同。下面的动画显示了这个示例在本地集群中的执行情况。
定义要研究的参数的值范围。创建一个meshgrid来解释参数的不同组合。
gridSize = 6;nu = linspace(100, 150, gridSize);mu = linspace(0.5, 2, gridSize);[N M] = meshgrid(ν,μ);
声明一个变量来存储扫描的结果。使用南
用于预分配,以避免绘制初始曲面。创建一个表面图来可视化每个参数组合的扫描结果。准备诸如标题、标签和限制之类的设置。
Z =南(大小(N));c = surf(N, M, Z);包含(“\μ值”,“翻译”,“泰克斯”)ylabel (“\ν值”,“翻译”,“泰克斯”)zlabel (" y的平均周期")视图(137,30)轴([100 150 0.5 2 0 500]);
创建一个DataQueue
将工人的中间结果发送给客户。使用afterEach
函数,用于在客户端中定义回调,该回调在每次工作人员发送当前结果时更新表面。
D = parallel.pool.DataQueue;D.afterEach (@ (x) updateSurface (c、x));
使用parfor
执行并行参数扫描。指导工人求解网格中各参数组合的系统,并计算平均周期。当工作者完成计算时,立即将每次迭代的结果发送回客户机。
parfori = 1:numel(N) [t, y] = solveVdp(N(ii), M(ii));l = islocalmax(y(:, 2));发送(D, [ii的意思(diff (t (l)))));结束
使用“本地”配置文件启动并行池(parpool)…连接到6个工人。
如果可以访问集群,就可以扩展计算。要做到这一点,删除以前的parpool
,然后使用较大集群的概要文件打开一个新集群。下面的代码显示了一个名为的集群配置文件“MyClusterInTheCloud”
。要自己运行这段代码,您必须替换“MyClusterInTheCloud”
使用您的集群配置文件的名称。调整工人人数。示例显示4个工人。通过增加网格的大小来增加整个计算的大小。
gridSize = 25;删除(gcp (“nocreate”));parpool (“MyClusterInTheCloud”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]);结束
为DataQueue声明一个函数,用来自工作者的结果更新图形。
函数更新数据表(s, d) s. zdata (d(1)) = d(2);drawnow (“limitrate”);结束
使用“MyClusterInTheCloud”配置文件启动并行池(parpool)……连接到4个工人。