Main Content

本页采用了机器翻译。点击此处可查看最新英文版本。

运行不使用并行池的 parfor-Loops

自 R2024a 起

此示例显示如何在没有并行池的大型集群上运行 parfor-loops。

直接在集群上运行 parfor 计算允许您使用数百个工作进程来执行 parfor 循环。当您使用此方法时,parfor 可以使用集群中所有可用的工作进程,并在循环完成后立即释放工作进程。如果您的集群不支持并行池,这种方法也很有用。然而,当您直接在集群上运行 parfor 计算时,您无法访问 DataQueueConstant 对象,并且工作进程会在迭代之间重新启动,这可能会导致大量开销。

此示例重新创建了 Jammer 等人 [2] 对 ARGESIM 基准 CP2 蒙特卡罗研究 [1] 的更新。对于 CP2 蒙特卡罗研究,您可以并行仿真具有不同随机采样阻尼系数的弹簧质量阻尼器系统。

创建集群对象

创建集群对象并显示集群中可用的工作进程数量。HPCProfile 是 MATLAB® 作业调度器集群的配置文件。

cluster = parcluster("HPCProfile");
maxNumWorkers = cluster.NumWorkers;
fprintf("Number of workers available: %d",maxNumWorkers)
Number of workers available: 496

定义仿真参数

设置质量弹簧系统 ODE 的仿真周期、时间间隔和初始状态。

period = [0 2]; % Use a period from 0 to 2 seconds
h = 0.001; % time step
t_interval = period(1):h:period(2);
y0 = [0 0.1]; 

设置迭代次数。

nReps = 10000000;

初始化随机数生成器并创建一个从范围为 [800,1200] 的均匀分布中采样的阻尼系数数组。

rng(0);
a = 800;
b = 1200;
d = (b-a).*rand(nReps,1)+a;

并行运行 ODE 求解并行

初始化归约操作的结果变量。

y_sum = zeros(numel(t_interval),1);

parfor 循环中执行 ODE 求解器来仿真具有不同阻尼系数的系统。要在集群上直接运行 parfor 计算,请将集群对象作为第二个输入参量传递给 parfor。使用归约变量来计算每个时间步骤的运动总和。

parfor(n = 1:nReps,cluster)
    f = @(t,y) massSpringODE(t,y,d(n));
    [tOut,yOut] = ode45(f,t_interval,y0);
    y_sum = y_sum + yOut(:,1);
end

计算系统的平均响应并绘制响应与时间的关系图。

meanY = y_sum./numel(d);
plot(t_interval,meanY)
title("ODE Solution of Mass-Spring System")
xlabel("Time")
ylabel("Motion")
grid on

比较计算加速

比较在集群上直接运行 parfor 循环与在并行池上运行 parfor 循环的计算加速。

使用附加到此示例的 timeAndCompareExecution 辅助函数来测量客户端上、在具有 496 个工作进程的并行池上以及直接在具有 496 个可用工作进程的集群上的 parfor-loop 工作流的执行时间。

[serialTime,hpcPoolTime,hpcClusterTime] = timeExecution("HPCProfile",maxNumWorkers);
elapsedTimes = [serialTime hpcPoolTime hpcClusterTime];

计算计算加速。

speedUp = elapsedTimes(1)./elapsedTimes;
fprintf("Speedup on cluster = %4.2f\nSpeedup on pool = %4.2f",speedUp(3),speedUp(2))
Speedup on cluster = 154.11
Speedup on pool = 171.23

创建一个条形图来比较每次执行的加速情况。图表显示,直接在集群上运行 parfor 循环与在并行池上运行 parfor 循环具有相似的加速。

figure;
x = ["Client","Pool","Cluster"];
bar(x,speedUp);
ylabel("Computational Speedup")
xlabel("parfor Execution Environment")
grid on

由于示例使用了 MATLAB 作业调度器集群,因此加速值相似。当您直接在 MATLAB 作业调度器集群上运行 parfor 循环时,parfor 有时可以重新使用工作进程而无需在迭代之间重新启动它们,从而减少了开销。如果直接在第三方调度器集群上运行 parfor 循环,则 parfor 会在迭代之间重新启动工作进程,这可能会导致大量开销和更低的加速值。

辅助函数

该辅助函数表示求解器使用的质量弹簧系统的 ODE。

您可以将描述弹簧质量系统 (eq1) 的微分方程重写为可以使用 ode45 求解器进行求解的一阶 ODE 系统 (eq2)。

dx˙(t)+kx(t)+mx¨(t)=0The differncial equations of the mass-spring-damper ODE system. (eq1)

y˙1=y2y˙2=-dy2+ky1m (eq2)

function dy = massSpringODE(t,y0,d)
k = 9000; % spring stiffness (N/m)
m = 450; % mass (kg)

dy = zeros(2,1);
dy(1) = y0(2);
dy(2) = -(d*y0(2)+k*y0(1))/m;
end

参考

[1] Breitenecker, Felix, Gerhard Höfinger, Thorsten Pawletta, Sven Pawletta, and Rene Fink."ARGESIM Benchmark on Parallel and Distributed Simulation."Simulation News Europe SNE 17, no. 1 (2007):53-56.

[2] Jammer, David, Peter Junglas, and Sven Pawletta.“Solving ARGESIM Benchmark CP2 ’Parallel and Distributed Simulation’ with Open MPI/GSL and Matlab PCT - Monte Carlo and PDE Case Studies.”SNE Simulation Notes Europe 32, no. 4 (December 2022):211–20. https://doi.org/10.11128/sne.32.bncp2.10625.

另请参阅

相关主题