Affinity
OpenMP binding 조절 방법
- 환경변수 이용
- OMP_PROC_BIND
- true : thread 가 프로세서에 고정
- spread : 스레드가 가능한 넓게 분산
- close : 스레드가 가능한 가까운 프로세서에 할당
- master : 스레드가 부모 스레드와 동일 프로세서에 고정
- false or disabled : no binding
- OMP_PLACEES
- 스레드를 특정한 하드웨어 자원 (코어, 소켓, PID) 배치를 지정
- cores : 물리적 코어에 스레드를 바인딩. 하이퍼스레딩 조건이라면 각 물리적 코어에 여러 스레드가 있을 수 있는데, 이 옵션은 물리적 코어 단위에 스레드를 고정
- threads : 시스템의 논리 프로세서 (하이퍼스레딩을 포함한 모든 CPU 스레드0 에 바인딩
- sockets : 각 CPU 소켓 단위로 스레드를 바인딩
- 명시적 프로세서 집합 : “{0,1},{2,3},{4,5},{6,7}” or “{0},{1},{2}” (thread 4개를 binding)
- 디렉티브 이용
- #pragma omp parallel proc_bind(spread)
OpenMP
- 모든 스레드가 동일한 메모리에 엑세스 함. (shared memory paradigm, 공유 변수 활용) 이 접근 방식은 루프 병렬화를 단순화하고 멀티 코어 프로세서 기능을 효과적으로 활용 가능.
- MPI 에 비해 synchronization, communication overhead 가 최소화 되므로 memory bandwidth 가 높은 경우에 효과적 임
- 구현이 용이함
- 기계 학습, 전산 유체 역학, 일기 예보 등에 사용
MPI
- message passing paradigm 에 기반 함 (process 는 explicit communication 으로 data 를 교환)
- 각 프로세스는 자체 메모리 공간이 있음
- 수천 개의 노드가 있는 대규모 시스템에서 탁월 함. HPC 에 적절. 대규모 시뮬레이션에 자주 사용.
- 복잡성이 증가하고 개발이 어려움
- 다른 아키텍처 노드로 이식성이 뛰어 남
- 대규모 기후 모델링, 분자 역학 시뮬레이션 등에 활용
OpenMP vs MPI 중 어떤걸 사용해야 할 지 선택하는 경우
Case1
메모리가 부족하고 Operations 이 빠르다면, MPI 사용이 적절
-> 통신을 최소한으로 제한하면서 메모리를 최대한 확보
Case2
dataset 이 작고 App 속도를 올리고 싶은 경우 OpenMP 가 적절 (사용이 쉬움)
Case3
더 많은 메모리 (= 더 많은 node) 와 계산 속도를 최대한 높이고 싶은 경우
- node 당 코어가 8개 이하인 경우 OpenMP 의 overhead (thread 시작 등) 이 processor-internal MPI communication (= share memory 에서의 MPI message 를 보내는 것) 보다 큼
- 하지만 node 당 코어가 16개 이상인 경우 MPI 와 OpenMP 를 동시에 쓰는게 유리 (하이브리드)
결론
-
항상 1개의 node 에서만 실행된다면 OpenMP 가 유리
-
대부분의 과학 코드는 다중 코어 노드를 완전히 사용하려고 할 때, 하이브리드 접근을 함.
-
hardware thread 지원이 될 때, thread-level parallelism 을 하는게 합리적임
-
MPI rank 가 올라가면 communication 이 증가하고, collective operation 이 값 비싸짐
-
계산 작업이 독립적이고, communication 이 많이 필요하지 않다면 MPI 병렬 처리가 의미가 있음
-
SMP or NUMA 아키텍처에서는 OpenMP 를 사용하지 않을 이유가 없음. OpenMP 와 MPI 는 완벽하게 함께 작동 가능함. OpenMP 는 각 node 에서 쓰고, node 간에는 MPI 를 씀. (hybrid programming) 이 방법이 고성능 컴퓨팅의 주류임
-
Network latency 는 보통 수 us 임. (operation 수천번 할 시간). 만약 Data 를 전송 했는데 계산량이 적다면, messaging overhead 가 더 커서 효율이 오히려 떨어 짐.
출처
https://stackoverflow.com/questions/11332018/mpi-vs-openmp-for-a-shared-memory
https://www.quora.com/Why-would-adding-MPI-slow-down-my-CUDA-OpenMP-parallel-program-rather-than-speed-it-up