2017-04-21 51 views
1

我试图控制执行我的MPI代码的位置。 这样做有几个办法,taskset的D放置numactl的或者仅仅是想--bind到-cpu设置的的的mpirun选项。绑定MPI进程,无超额订阅

机器:共享存储器,16个节点的2倍12cores(每节点,以便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,D放置或numactl的(我没有看到主要的区别...)

的mpirun -np 64 D放置-c144-191,336-383 ./myexec param> LOGFILE.LOG

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

(两者的主要区别在于, '结合的' numactl的的-l记忆,但我也不确定它是否有差别。)

所以,他们都做工精良,工艺界,我想,通过寻找更贴近每一个过程,看来有些分配在同一个核心上!所以他们每个只使用核心的50%!即使可用内核的数量大于进程的数量,也会发生这种情况!这根本不好。

所以我尝试添加一些的mpirun选择启用像--nooversubscribe但它改变不了什么......我不明白这一点。我也试着用- 绑定到无(为了避免mpirun和dplace/numactl之间的冲突),-cpus-per-proc 1-cpus-per-rank 1 ......没有解决它。

所以,我想只有选择的mpirun

的mpirun -cpu设置144-191 -np 64 ./myexec param> LOGFILE.LOG

但-cpu设置的选项不大量记录,而且我没有找到一种方法来为每个核心绑定一个进程。

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

回答

2

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

一般来说,开放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)。

+0

- 线程的权利,每个核心可能有2个线程(191以上的所有核心是'虚拟'线程)。我的情况是,我想要64个进程,超过12个cpu,所以我需要5.3 cpu。为了减少沟通成本,我考虑只使用4cpus,所以有48个核心,剩下的16个使用虚拟核心。可能吗? 附加问题/建议: - 从htop我可以看到我的进程在它所绑定的内核的两个线程之间跳转(例如168到360)?这是正常的吗? - 我可以在命令行中添加numactl -l以强制内存为本地?或者它使用较少? –

+1

是的,如果在'--report-bindings'处于活动状态时查看输出,则会看到类似“../ BB /../ ..'的内容,这意味着进程绑定到两个硬件线程。硬件线程共享整个缓存层次结构时,它们之间的迁移非常便宜。你可以使用'--bind-to hwthread'来绑定到单个线程,但是当与'--cpu-set'结合使用时可能会混淆映射器(至少它在我的系统上) –

+0

至于内存绑定,当CPU绑定激活时,Open MPI执行一些内存绑定。但是如果你想确定和具体,你可以用'numactl -m'包装你的程序,例如'mpirun ... -n 12 numactl -m 10 ./myexec param:-n 12 numactl -m 11 ./myexec param:-n 12 numactl -m 12 ./myexec param'。这将启动3组12个进程,其内存分别绑定到节点10,11和12。这些过程仍将是同一MPI作业的一部分,即将共享“MPI_COMM_WORLD”。确保NUMA节点与每个进程执行的节点相匹配。 –