2017-04-21 1 views
1

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

명령의 실제 CPU 목록에서 336-383을 생략하십시오. 그것들은 두 번째 하드웨어 쓰레드이고, 허용 된 CPU 목록에 두 개의 하드웨어 쓰레드가 있다면, OS는 동일한 코어의 다른 하드웨어 쓰레드에서 두 개의 프로세스를 스케줄 할 수 있습니다. 열기 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.3cpus가 필요하다. 통신 비용을 줄이기 위해 나는 단지 4cpus 만 사용하려고 생각하고 있었고, 따라서 48 코어와 나머지 16 비트는 가상 서버에 넣었습니다. 그것은 가능한가? 기타 질문/조언 : - from htop 내 프로세스가 바인딩되는 코어의 두 스레드 (예 : 168 ~ 360) 사이에서 점프하는 것을 볼 수 있습니까? 정상입니까? - 메모리를 로컬로 강제 실행하려면 numactl -l을 명령 줄에 추가해도됩니까? 아니면 덜 사용합니까? –

+1

예,'--report-bindings'이 활성화되었을 때 출력을 보면'../BB/../ .. '와 같은 것을 볼 수 있습니다. 이것은 프로세스가 두 하드웨어 스레드에 바인딩되어 있음을 의미합니다 . 하드웨어 스레드가 전체 캐시 계층을 공유하기 때문에 이들 사이의 마이그레이션은 정말 저렴합니다. '--bind-to hwthread'를 사용하여 단일 쓰레드에만 바인드 할 수 있지만'--cpu-set'과 함께 사용할 때 매퍼를 혼란스럽게 할 수 있습니다 (적어도 시스템에서는 그렇습니다) –

+0

메모리 바인딩, 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 노드가 각 프로세스가 실행되는 노드와 일치하는지 확인하십시오. –

관련 문제