绑定MPI流程,没有超额订阅

时间:2017-04-21 13:23:34

标签: mpi openmpi numa pinning

我正在尝试控制执行MPI代码的位置。 要做到这一点,有几种方法,任务集 dplace numactl 或只是 mpirun 的选项,如 - 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 

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

到目前为止我尝试了什么

经典电话 mpirun -np 64 ./myexec param> LOGFILE.LOG

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

mpirun -np 64 dplace -c144-191,336-383 ./myexec param> LOGFILE.LOG

mpirun -np 64 numactl --physcpubind = 144-191,336-383 -l ./myexec param> LOGFILE.LOG

(两者的主要区别在于-n的numactl'记忆,但我甚至不确定它会产生什么影响......)

所以,它们都运行良好,流程在我想要的地方,通过仔细观察每个流程,似乎有些分配在同一个核心上!所以他们每个只使用50%的核心!即使可用核心数大于进程数,也会发生这种情况!这根本不好。

所以我尝试添加一些 mpirun optin,比如 - nooversubscribe ,但它什么都没改变......我不明白。我也尝试使用 - bind-to none (以避免mpirun和dplace / numactl之间的冲突), -cpus-per-proc 1 -cpus-每等级1 ......没有解决它。

所以,我只尝试了mpirun选项

mpirun -cpu-set 144-191 -np 64 ./myexec param> LOGFILE.LOG

但-cpu-set选项没有大量记录,我找不到每个核心绑定一个进程的方法。

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

1 个答案:

答案 0 :(得分:2)

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

通常,使用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用于防止库放置比节点上定义的插槽更多的进程。默认情况下,操作系统可以看到与逻辑CPU一样多的插槽,因此通过此选项在您的情况下不执行任何操作(64 <384)。