MPI 코드를 어디에 실행할지 제어하려고합니다. 는 taskset, dplace, numactl은 또는 - CPU-설정을 --bind-또는 같은 에 mpirun 단지 옵션, 여러 가지 방법이 있습니다 이렇게하려면.MPI 프로세스 바인딩, no-oversubscribe
기계 : 공유 메모리,
가 가 공유 메모리를 활용하지 않는 내 코드는 내가 사용하는> 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
싶습니다 2 배 12cores (노드 당 그래서 24 개 코어)의 16 개 노드, 그것은 분산 메모리에서와 마찬가지입니다. 그러나 프로세스가 이동하여 데이터에서 너무 멀리 떨어져있는 것처럼 보이므로 바인딩하고 성능이 더 좋은지 확인하고 싶습니다. 지금까지 노력이 무엇 :
고전적인 전화 에 mpirun -np 64 ./myexec PARAM>있는 logfile.log
지금 내가 마지막 노드에서 실행을 결합하고 싶었다, (... 내가 큰 차이점을 볼 수 없습니다) dplace 또는 numactl은 함께, 15 (12)를 말할 수에 mpirun -np 64 dplace -c144-191,336-383 ./myexec PARAM>있는 logfile.log
,536 91,363,210에 mpirun -np 64 numactl은 --physcpubind = 144-191,336-383 -l ./myexec PARAM>있는 logfile.log
(이들의 주된 차이는 "결합 된"것으로 numactl은의 -l은 메모리,하지만 난 그게 차이가 있는지조차 확실하지 않다 ..)
그래서, 그들은 모두 내가 가까이 각 프로세스에보고 하지만에 싶었던 프로세스가 경계하는, 잘 작동이 나타납니다 일부는 동일한 코어에 할당됩니다! 그래서 그들은 코어의 50 % 만 사용하고 있습니다! 사용 가능한 코어의 수가 프로세스의 수보다 클 경우에도 이런 일이 발생합니다! 이것은 전혀 좋지 않습니다.
그래서 나는 --nooversubscribe 같은 일부 에 mpirun 수신 선택 기능을 추가하려고하지만 아무것도 변하지 않는다 ... 나는 그것을 이해하지 않습니다. 또한 으로 시도하십시오 - (mpirun과 dplace/numactl 사이의 충돌을 피하기 위해) -CPU 당 1 및 -cpus-1-rank 1 ... 해결하지 못합니다.
그래서, 난 단지에 mpirun 옵션을 시도
에 mpirun - CPU-설정 144-191 -np 64 ./myexec PARAM>있는 logfile.log
하지만 - CPU-설정 옵션은 아니다 대량으로 문서화되었고 코어 당 하나의 프로세스를 바인딩 할 방법을 찾지 못했습니다.
질문 : 내가 원하는 코어에서 누군가가 코어 당 하나의 프로세스를 가질 수있게 도와 줄 수 있습니까?
- 스레드의 경우 각 코어는 2 개의 스레드를 가질 수 있습니다 (191 위의 모든 코어는 '가상'스레드입니다). 필자의 경우, 64 프로세스를 원한다. 12 코어 이상의 CPU가 필요하므로 5.3cpus가 필요하다. 통신 비용을 줄이기 위해 나는 단지 4cpus 만 사용하려고 생각하고 있었고, 따라서 48 코어와 나머지 16 비트는 가상 서버에 넣었습니다. 그것은 가능한가? 기타 질문/조언 : - from htop 내 프로세스가 바인딩되는 코어의 두 스레드 (예 : 168 ~ 360) 사이에서 점프하는 것을 볼 수 있습니까? 정상입니까? - 메모리를 로컬로 강제 실행하려면 numactl -l을 명령 줄에 추가해도됩니까? 아니면 덜 사용합니까? –
예,'--report-bindings'이 활성화되었을 때 출력을 보면'../BB/../ .. '와 같은 것을 볼 수 있습니다. 이것은 프로세스가 두 하드웨어 스레드에 바인딩되어 있음을 의미합니다 . 하드웨어 스레드가 전체 캐시 계층을 공유하기 때문에 이들 사이의 마이그레이션은 정말 저렴합니다. '--bind-to hwthread'를 사용하여 단일 쓰레드에만 바인드 할 수 있지만'--cpu-set'과 함께 사용할 때 매퍼를 혼란스럽게 할 수 있습니다 (적어도 시스템에서는 그렇습니다) –
메모리 바인딩, Open MPI는 CPU 바인딩이 활성화 될 때 일부 메모리 바인딩을 수행합니다. 그러나 당신이 확실하고 구체적으로하고 싶다면'numactl -m'으로 프로그램을 감쌀 수있다. 예를 들어'mpirun ... -n 12 numactl -m 10 ./myexec param : -n 12 numactl -m 11 ./myexec param : -n 12 numactl -m 12 ./myexec param'. 그러면 12 개의 프로세스로 구성된 3 개의 그룹이 시작되어 각각 메모리가 노드 10, 11 및 12에 바인드됩니다. 프로세스는 여전히 동일한 MPI 작업의 일부가되며, 즉 'MPI_COMM_WORLD'을 공유합니다. NUMA 노드가 각 프로세스가 실행되는 노드와 일치하는지 확인하십시오. –