parfor
这个示例演示了如何并行执行参数扫描,并在并行计算期间绘制进度图。你可以用DataQueue
在并行池上进行计算时监视结果。你也可以用aDataQueue
具有并行语言特性,例如parfor
,parfeval
和spmd
.
这个例子展示了如何执行一个参数扫描的经典系统,范德堡尔振荡器。该系统可以表示为依赖于两个范德堡尔振荡器参数的ode集合, 和 :
您可以对参数执行并行参数扫描
和
使用一个parfor
的平均周期
当不同。下面的动画显示了在本地集群中执行此示例的过程。
定义要研究的参数的值范围。创建一个网格来说明参数的不同组合。
gridSize = 6;mu = linspace(100, 150, gridSize);nu = linspace(0.5, 2, gridSize);[M, N] = meshgrid(μ,ν);
声明一个变量来存储扫描的结果。使用南
用于预分配,以避免绘制初始曲面。创建一个表面图来可视化每个参数组合的扫描结果。准备标题、标签和限制等设置。
Z =南(大小(N));c = surf(M, N, 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
执行并行参数扫描。指导工作人员对网格中各参数组合进行系统求解,计算平均周期。当工作人员完成计算时,立即将每次迭代的结果发送回客户机。
parforii = 1:numel(N) [t, y] = solveVdp(M(ii), N(ii));L = islocalmax(y(:, 2));发送(D, [ii的意思(diff (t (l)))));结束
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:6)。
如果您可以访问集群,则可以扩展计算量。要做到这一点,删除前面的parpool
,然后使用概要文件为更大的集群打开一个新的概要文件。下面的代码显示了一个名为“MyClusterInTheCloud”
.要自己运行此代码,必须替换“MyClusterInTheCloud”
使用集群配置文件的名称。调整工人数量。这个例子显示了4个工人。通过增加网格的大小来增加总体计算的大小。
gridSize = 25;删除(gcp (“nocreate”));parpool (“MyClusterInTheCloud”4);
使用myclusterincloud配置文件启动并行池(parpool)…连接到并行池(工作人员数量:4)。
如果您在设置集群概要文件之后再次运行参数扫描代码,那么集群中的工作人员将计算结果,并在结果可用时将其发送到MATLAB客户机。下面的动画显示了在集群中执行这个示例的过程。
创建一个辅助函数来定义方程组,并在其上应用求解器。
函数[t, y] = = * (u, u)μ* (1 y (1) ^ 2) * y (2) - y (1)];[t,y] = ode23s(f,[0 20*mu],[2;0]);结束
为DataQueue声明一个函数,以使用来自工人的结果更新图。
函数updatessurface (s, d) . zdata (d(1)) = d(2);drawnow (“limitrate”);结束