openmpi hybrid (MPI+OpenMP) 성능 문제

In the world/컴퓨터 2018. 9. 22. 00:50

openmpi 3.1.0 버전을 이용하여 hybrid (MPI+OpenMP) 프로그램을 실행하면 스레드 성능이 제대로 나오지 않는 문제가 발생한다.

여러가지로 테스트해본 결과 최신 버전의 openmpi는 프로세스를 코어와 할당하도록 동작시켜 여러 스레드가 하나의 코어에서 실행된다.

다음과 같이 mpirun 명령에 "--report-bindings" 옵션을 주어 프로세스가 어떻게 할당되는 지 알아 볼 수 있다.

 $ mpirun -n 2 --report-bindings ./pi_openmpi.x 

[pbcm:405591] MCW rank 0 bound to socket 0[core 0[hwt 0]]: [B/././././././././././.][./././././././././././.]

[pbcm:405591] MCW rank 1 bound to socket 0[core 1[hwt 0]]: [./B/./././././././././.][./././././././././././.]

 myrank =           0 :           1  ~    500000000

 myrank =           1 :   500000001  ~   1000000000

 numerical  pi =    3.14159265259024     

 analytical pi =    3.14159265358979     

  Error =   9.995542171736815E-010


테스트 시스템은 Intel Xeon skylake 2 소켓, 총 40 코어가 장착되어 있다.

MPI 프로세스 2 개가 발생하였고, 하나의 코어에 할당되어 있다는 것을 알 수 있다.

[B/././././././././././.] 부분에서 "B"가 프로세스가 bind 된 상태를 나타낸다. "."은 프로세스가 할당되지 않은 코어다.

당연히 프로세스 하나에 하나의 코어 만 할당되기 때문에 여러 스레드가 발생해도 성능향상이 제대로 나타나지 않는다.

이 문제를 해결하기 위해 "--map-by NUMA:PE=N" 옵션을 사용할 수 있다. 여기에서 N은 하나의 프로세스가 할당되는 코어 개수가 된다.

8 개 스레드를 사용한다면 다음과 같이 실행하면 하나의 프로세스에 8 개의 코어를 할당할 수 있다.

$ mpirun -n 2 --report-bindings --map-by NUMA:PE=8 ./pi_openmpi.x 

[pbcm:408424] MCW rank 0 bound to socket 0[core 0[hwt 0]], socket 0[core 1[hwt 0]], socket 0[core 2[hwt 0]], socket 0[core 3[hwt 0]], socket 0[core 4[hwt 0]], socket 0[core 5[hwt 0]], socket 0[core 6[hwt 0]], socket 0[core 7[hwt 0]]: [B/B/B/B/B/B/B/B/./././.][./././././././././././.]

[pbcm:408424] MCW rank 1 bound to socket 1[core 12[hwt 0]], socket 1[core 13[hwt 0]], socket 1[core 14[hwt 0]], socket 1[core 15[hwt 0]], socket 1[core 16[hwt 0]], socket 1[core 17[hwt 0]], socket 1[core 18[hwt 0]], socket 1[core 19[hwt 0]]: [./././././././././././.][B/B/B/B/B/B/B/B/./././.]

 myrank =           0 :           1  ~    500000000

 myrank =           1 :   500000001  ~   1000000000

 numerical  pi =    3.14159265259024     

 analytical pi =    3.14159265358979     

  Error =   9.995542171736815E-010 

[B/B/B/B/B/B/B/B/./././.] 부분에서 알 수 있듯이 8개의 코어에 프로세스가 할당되는 것을 알 수 있다.


openmpi는 버전이 올라감에 따라 다양한 아키텍처에서 유연하게 사용할 수 있도록 자유도가 높아지는 경향을 보인다.

대신에 사용자 입장에서는 제대로 사용하기 위해서는 여러가지 고려할 것이 더 많아지고 있다.

이상 hybrid 성능이 안나와서 삽질한 이야기.

: