我試圖控制執行我的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個線程(191以上的所有核心是'虛擬'線程)。我的情況是,我想要64個進程,超過12個cpu,所以我需要5.3 cpu。爲了減少溝通成本,我考慮只使用4cpus,所以有48個核心,剩下的16個使用虛擬核心。可能嗎? 附加問題/建議: - 從htop我可以看到我的進程在它所綁定的內核的兩個線程之間跳轉(例如168到360)?這是正常的嗎? - 我可以在命令行中添加numactl -l以強制內存爲本地?或者它使用較少? –
是的,如果在'--report-bindings'處於活動狀態時查看輸出,則會看到類似「../ BB /../ ..'的內容,這意味着進程綁定到兩個硬件線程。硬件線程共享整個緩存層次結構時,它們之間的遷移非常便宜。你可以使用'--bind-to hwthread'來綁定到單個線程,但是當與'--cpu-set'結合使用時可能會混淆映射器(至少它在我的系統上) –
至於內存綁定,當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節點與每個進程執行的節點相匹配。 –