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 성능이 안나와서 삽질한 이야기.