2013-06-05 1 views
1

내 MPI 프로세스를 (물리적 인) 코어 목록에 정확하게 고정하고자합니다. 나는 mpirun이 --help 출력의 다음 사항을 참조하십시오mpirun --cpu-set 대 --rankfile (Open MPI) 1.4.5

-cpu-set|--cpu-set <arg0> 
         Comma-separated list of ranges specifying logical 
         cpus allocated to this job [default: none] 

...

-rf|--rankfile <arg0> 
         Provide a rankfile file 

은 다음 내 프로세서 토폴로지가 될 때 :

------------------------------------------------------------- 
CPU type:  Intel Core Bloomfield processor 
************************************************************* 
Hardware Thread Topology 
************************************************************* 
Sockets:  1 
Cores per socket:  4 
Threads per core:  2 
------------------------------------------------------------- 
HWThread  Thread   Core   Socket 
0    0    0    0 
1    0    1    0 
2    0    2    0 
3    0    3    0 
4    1    0    0 
5    1    1    0 
6    1    2    0 
7    1    3    0 
------------------------------------------------------------- 
Socket 0: (0 4 1 5 2 6 3 7) 
------------------------------------------------------------- 

을 이제 경우 mpirun -np 2 --cpu-set 0,1 --report-bindings ./solver 프로그램을 정상적으로 시작하지만 고려하지 않음 --cpu-set 인수를 제공했습니다. 그에 mpirun을 실제로 최고으로 확인

[neptun:14781] [[16333,0],0] odls:default:fork binding child [[16333,1],0] to slot_list 0 
[neptun:14781] [[16333,0],0] odls:default:fork binding child [[16333,1],1] to slot_list 1 

나를 보여줍니다 나에게 다음과 같은 출력을 제공 ./solver에 mpirun -np 2 --rankfile rankfile --report-바인딩 내 프로그램을 시작하는 한편 실제로 지정된 코어를 사용합니다. 그러나이 산출물을 어떻게 해석해야합니까? 호스트 (neptun)와 지정된 슬롯 (0,1)을 제외하고 나는 실마리가 없습니다. 다른 명령과 동일 나는 밖으로 시도 :

$mpirun --np 2 --bind-to-core --report-bindings ./solver 
[neptun:15166] [[15694,0],0] odls:default:fork binding child [[15694,1],0] to cpus 0001 
[neptun:15166] [[15694,0],0] odls:default:fork binding child [[15694,1],1] to cpus 0002 

와 함께

$mpirun --np 2 --bind-to-socket --report-bindings ./solver 
[neptun:15188] [[15652,0],0] odls:default:fork binding child [[15652,1],0] to socket 0 cpus 000f 
[neptun:15188] [[15652,0],0] odls:default:fork binding child [[15652,1],1] to socket 0 cpus 000f 

최고 명령을 다시 한 번 코어 0과 1이 사용되는 것을 나에게 보여 --bind-에 코어, 출력은 왜입니까 cpus 0001 및 ? - 바인드 소켓은 더 많은 혼동을 초래합니다. 2x 000f? 왜 작업 명령을 --cpu-설정되어 있지 않습니다 -
:

나는 내 실험에서 arrose 질문을 요약하는 마지막 단락을 사용할 수 있습니까?
- --report-bindings 출력의 결과를 어떻게 해석해야합니까?

종류는 출력이 정확히 당신이 열기 MPI를 말한 것과 일치 두 경우 모두

답변

2

을 간주한다. cpus ...의 16 진수는 프로세스에 허용 된 CPU (선호도 마스크)를 표시합니다. 이것은 각 비트가 하나의 논리 CPU를 나타내는 비트 필드입니다.

--bind-to-core으로 각 MPI 프로세스는 자체 CPU 코어에 바인딩됩니다. 순위 0 ([...,0])은 선호도 마스크가 0001, 즉 논리 CPU 0을 의미합니다. 순위 1 ([...,1])은 선호도 마스크가 0002으로 설정되어 있고 논리 CPU 1을 의미합니다. 논리 CPU 번호 지정은 출력의 HWThread 식별자와 일치 할 가능성이 높습니다. 토폴로지 정보.

--bind-to-socket으로 각 MPI 프로세스는 소켓의 모든 코어에 바인딩됩니다.특정 경우 선호도 마스크는 000f 또는 이진수는 0000000000001111 (소켓의 모든 4 개 코어에 해당)으로 설정됩니다. 코어 당 하나의 하이퍼 스레드 만 할당됩니다.

다중 소켓 노드에서 소켓을 선택하는 방법을 Open MPI에 추가로 지시 할 수 있습니다. --bysocket을 사용하면 소켓은 라운드 로빈 방식으로 선택됩니다. 즉, 첫 번째 순위는 첫 번째 소켓에 배치되고 다음 순위는 다음 소켓에 배치되며 소켓 당 하나의 프로세스가있을 때까지 다음 순위가 다시 지정됩니다 첫 번째 소켓에 넣고 등등. --bycore을 사용하면 각 소켓은 해당 소켓의 코어 수만큼 연속 순위를받습니다.

Open MPI 1.4.x 용 mpirun의 설명서, 특히 Process Binding 섹션을 읽는 것이 좋습니다. 다양한 바인딩 옵션이 서로 어떻게 상호 작용하는지에 대한 몇 가지 예가 있습니다. 제프 스콰 이어 (Jeff Squyres)가 processor affinity features in Open MPI에 좋은 페이지를 작성했지만 (v1.5에 관한 페이지이지만 대부분이 모두 v1.4에도 적용되지는 않음) 멋진 페이지를 작성했지만 --cpu-set 옵션은 매뉴얼에 언급되어 있지 않습니다.

+0

그게 문제를 해결했습니다. 감사합니다! 좋은 링크, 나는 이미 그 두 페이지에 많은 시간을 보냈지 만, 작동하지 않는 CPU 설정 옵션에 대한 설명을 찾을 수 없습니다 ... –