最近我正在 M1 Mac mini 上进行一些分子动力学模拟 (LAMMPS)。
对于一个简单的任务,我使用命令:
lmp_serial -in run.in.npt
我相信这意味着单 CPU 计算。我需要 4 分 45 秒的运行时间。然后我尝试使用 4 个内核运行:
mpirun -np 4 lmp_mpi -in run.in.npt
我花了 1 分 51 秒。
但是当我使用 8 个内核时:
mpirun -np 8 lmp_mpi -in run.in.npt
它没有跑得更快,我花了 3 分 38 秒。
为了对比,然后我尝试了2核和6核,我在这里总结一下:
1 core : 4 min 45 second
2 cores : 2 min 55 second
4 cores : 1 min 51 second
6 cores : 4 min 45 second
8 cores : 3 min 38 second
有人知道是什么原因吗?这与Open MPI有关吗? (如果Mac没有预装的话,我后面就没有安装了)
答案 0 :(得分:0)
LAMMPS 通过执行域分解来分配工作。例如,通过空间分解,模拟体积被切割成盒子,并且特定盒子中的所有粒子都被分配到某个 MPI 等级进行处理。因为分子动力学中的积分是全局同步操作,所以每一步只有在所有 MPI 等级都完成后才完成。因此,完成积分步骤所需的时间等于最慢的 MPI 等级完成其分配的框所需的时间。
M1 是一种类似于 ARM DynamIQ(big.LITTLE 的继任者)的架构,包含速度快但耗电的内核(Firestorm 内核)和速度慢但能效高的内核(冰风暴核心)。 Mac Mini 中的 M1 芯片每种类型有四个。由于 macOS 不提供明确的 CPU 关联性,因此 MPI 库只是启动给定数量的 rank,由操作系统在可用内核上尽可能高效地调度它们。最多有四个 MPI 等级,它们最终都使用自己的 Firestorm 核心。一旦你超过四个 MPI 等级,一些将落在一个缓慢的 Icestorm 核心上,或者将与其他一些等级分时共享一个快速核心。在这两种情况下,至少会有一个排名比其他排名慢得多,因此整体性能会受到影响。
另一件需要注意的事情是,现代 CPU 会根据热条件改变其核心频率。如果只加载一个内核,它可能会被提升超过其标称频率。当加载更多内核时,会产生更多热量,并且内核不会像前一种情况那样提高频率。因此,从 1 核到 2 核再到 4 核不会给你线性加速,即使问题是令人尴尬的并行。
另外,请记住,所使用的域分解类型会对并行性能产生巨大影响。例如,在空间分解中,如果原子在子域中分布不均,或者它们以非均匀方式在子域之间移动,则会出现负载不平衡,加速也会受到影响。