绑定 MPI 进程,不超额订阅
Bind MPI processes, with no-oversubscribe
我正在尝试控制我执行 MPI 代码的位置。
有几种方法可以做到这一点,taskset、dplace、numactl 或者 [=] 的选项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)。
我正在尝试控制我执行 MPI 代码的位置。 有几种方法可以做到这一点,taskset、dplace、numactl 或者 [=] 的选项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)。