绑定 MPI 进程,不超额订阅

Bind MPI processes, with no-oversubscribe

我正在尝试控制我执行 MPI 代码的位置。 有几种方法可以做到这一点,tasksetdplacenumactl 或者 [=] 的选项41=]mpi运行 如 --bind-to-cpu-set

机器:是共享内存,16个节点,2倍12核(所以每个节点24个核)

> numactl -H
  available: 16 nodes (0-15)
  node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 192 193 194 195 196 197 198 199 200 201 202 203
  node 1 cpus: 12 13 14 15 16 17 18 19 20 21 22 23 204 205 206 207 208 209 210 211 212 213 214 215
  node 2 cpus: 24 25 26 27 28 29 30 31 32 33 34 35 216 217 218 219 220 221 222 223 224 225 226 227
  ... (I reduce the output)
  node 15 cpus: 180 181 182 183 184 185 186 187 188 189 190 191 372 373 374 375 376 377 378 379 380 381 382 383
  node distances:
  node   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15 
  0:  10  50  65  65  65  65  65  65  65  65  79  79  65  65  79  79 
  1:  50  10  65  65  65  65  65  65  65  65  79  79  65  65  79  79 
  2:  65  65  10  50  65  65  65  65  79  79  65  65  79  79  65  65 
  3:  65  65  50  10  65  65  65  65  79  79  65  65  79  79  65  65 
  4:  65  65  65  65  10  50  65  65  65  65  79  79  65  65  79  79 
  5:  65  65  65  65  50  10  65  65  65  65  79  79  65  65  79  79 
  6:  65  65  65  65  65  65  10  50  79  79  65  65  79  79  65  65 
  7:  65  65  65  65  65  65  50  10  79  79  65  65  79  79  65  65 
  8:  65  65  79  79  65  65  79  79  10  50  65  65  65  65  65  65 
  9:  65  65  79  79  65  65  79  79  50  10  65  65  65  65  65  65 
 10:  79  79  65  65  79  79  65  65  65  65  10  50  65  65  65  65 
 11:  79  79  65  65  79  79  65  65  65  65  50  10  65  65  65  65 
 12:  65  65  79  79  65  65  79  79  65  65  65  65  10  50  65  65 
 13:  65  65  79  79  65  65  79  79  65  65  65  65  50  10  65  65 
 14:  79  79  65  65  79  79  65  65  65  65  65  65  65  65  10  50 
 15:  79  79  65  65  79  79  65  65  65  65  65  65  65  65  50  10 

我的代码没有利用共享内存,我想在分布式内存上使用它。但是这些进程似乎移动并且离它们的数据太远了,所以我想绑定它们并查看性能是否更好。

到目前为止我尝试了什么:

经典调用mpi运行 -np 64 ./myexec param > logfile.log

现在我想在最后一个节点上绑定 运行,比方说 12 到 15,使用 dplace 或 numactl(我看不出主要区别...)

mpi运行 -np 64 dplace -c144-191,336-383 ./myexec 参数 > logfile.log

mpi运行 -np 64 numactl --physcpubind=144-191,336-383 -l ./myexec 参数 > logfile.log

(两者的主要区别是 numactl 的 -l 'bound' 内存,但我什至不确定它是否有所不同..)

所以,它们都工作得很好,进程在我想要的地方被限制,但是通过仔细观察每个进程,似乎有些分配在同一个核心上!所以他们每个人只使用了 50% 的核心!即使可用核心数大于进程数,也会发生这种情况!这一点都不好。

所以我尝试添加一些 mpi运行 optin 就像 --nooversubscribe 但它没有改变......我不明白。我也尝试 --bind-to none (以避免 mpi运行 和 dplace/numactl 之间的冲突),-cpus-per-proc 1 and -cpus-per-rank 1...没有解决它。

所以,我只尝试了 mpi运行 选项

mpi运行 -cpu-set 144-191 -np 64 ./myexec param > logfile.log

但是 -cpu-set 选项没有大量记录,我也没有找到一种方法来为每个内核绑定一个进程。

问题:有人可以帮我在我想要的内核上让每个内核有一个进程吗?

numactl 命令的物理 CPU 列表中省略 336-383。这些是第二个硬件线程,将它们放在允许的 CPU 列表中允许 OS 在同一核心的不同硬件线程上安排两个进程。

一般来说,对于 Open MPI,映射和绑定是两个独立的操作,并且都在核心基础上完成,以下选项是必需的:

--map-by core --bind-to core

映射器默认从第一个套接字上的第一个内核启动。要限制核心选择,请传递 --cpu-set from-to。在你的情况下,完整的命令应该是:

mpirun --cpu-set 144-191 --map-by core --bind-to core -np 64 ./myexec param > logfile.log

您还可以传递 --report-bindings 选项以获得绑定的漂亮图形可视化(在您的情况下,这将有点难以阅读...)

请注意,--nooversubscribe 用于防止库放置比节点上定义的插槽更多的进程。默认情况下,插槽的数量与 OS 看到的逻辑 CPU 一样多,因此传递此选项对您的情况没有任何作用 (64 < 384)。