요즘 블로그 유입통계를 보니 LAPACK을 찾아 유입된경우가 있더라..
졸업논문 쓰려고 MPI 클러스터 구축하던 때에 기록하기 위해 작성했던 글..
15년전에 CUDA로 졸업논문을 쓸지, Hybrid MPI (OpenMP + MPICH)로 졸업논문을 쓸지 고민하다 Hybrid MPI로 선택하고 클러스터 구축하느라 고생했던(삽질했던)기억이 나면서 블로그 보다보니 어? OpenMP와 MPI에 대해 정리해둔게 없었네?
그냥 까먹지 말자고 대략적으로 내용 정리. 물론.. 내 졸업논문쓰던때 기준(2008년)이라 많이 바뀌었을수도 있다.
구분 | MPI | OpenMP |
특징 | - 클러스터에 속한 프로세서들을 사용하여 병렬화를 구현함. CPU수가 모자라면 클러스터에 노드 추가하여 확장하면 된다.(확장성이 좋다. 그리고 싸다. 일반 데스크탑 몇개 묶어서 해보니 잘 돌더라) - 병렬화를 위한 프로세스간 통신을 위해 네트워크 통신이 필요하다. -> 오버헤드가 있다. - MPI컴파일러로 빌드하고, 실행도 MPIRun으로 해야한다. (2008년기준. 지금도 그런지 확인필요) |
- 단일 머신에 있는 프로세서들을 활용하여 병렬화한다. 그래서 병렬화를 위한 프로세스간 통신만 하게되어 MPI대비 성능이 좀 더 좋다 (2008년 기준) - 확장하기에는 어렵다. (머신을 교체해야하니까. 근데 슈퍼컴퓨터가격이 얼마더라...) - 소스코드상에 지시어를 붙여서 병렬화를 할 수 있다. VS2012인가 기준으로 OpenMP지시어를 아예 지원해주더라. 별도의 실행프로그램 없어도 된다. |
- MPI 동작 개념
- OpenMP 동작개념
(근데 졸업논문이라고 그림 참 성의없게 만들긴했다.. ㅋ)
내 졸업논문의 주제가.. SMP머신들로 구성된 클러스터에서 OpenMP와 MPI를 같이 사용하여 더 높은 성능을 내는것이었는데..
그게 MPICH2인가 그 이후에 그걸 지원하도록 나온것 같던데..
내가 논문으로 쓸때도 보니까 MPI만 쓰는것 보다 MPI + OpenMP가 더 성능이 잘나오긴 하더라. 물론 노드별로 프로세서 배분을 어떻게 하느냐에 따라 많은 차이가 발생하지만. (최악의 조합의 경우 단일 MPI보다 느렸음).
CUDA등 GPU를 활용한 컴퓨팅, 병렬프로그래밍에서 노드 분배 및 노드별로 처리할 데이터 분배는 중요한 문제다.
노드가 너무 과하게 분배하면 노드끼리 통신하는데 들어가는 오버헤드가 크다. 연산할 데이터 전달하는것도 문제고. 모든 프로세서가 동일한 속도를 보장하지 않으므로, 모두가 작업이 끝날때까지 대기해야한다. (사실 병렬프로그래밍에서 프로세서수가 n배가 된다고 수행시간이 1/n으로 줄지 않는 큰 이유 중 하나. 또하나는 모든 연산이 병렬화가 가능하지않다는 것. 단순 루프라 하여도 이전 반복의 결과가 현재 반복에 영향을 끼치면 병렬화할 수 없다. 즉, 병렬화 효율을 높이기 위해서는 병렬화 할 구간의 데이터간 의존도를 낮추는 것이 중요하다.).
그리고, 데이터 분배도 중요한 문제다. 적어도 일감을 가져가는 프로세스에게 데이터를 줬는데 가용메모리보다 적다 -> 효율성이 낮다. 반대로 너무 많이줘서 여러번 보내야한다면? -> 통신은 생각보다 느리다.
뱀발로.. CUDA를 사용하여 컴퓨팅할때 블럭 사이즈 (GPU에게 전달해 줄 데이터 크기) 조절에 따라 CUDA의 효율성이 널을뛴다. CUDA안쓸때 대비 수십%~백단위배수까지 성능차이가 발생한다.
댓글