하이브리드 병렬 시뮬레이션 프레임워크
초록
본 논문은 기존 순차 시뮬레이션 코드를 최소한의 수정만으로 MPI와 OpenMP를 결합한 하이브리드 병렬 프로그램으로 변환할 수 있는 작업 기반 프레임워크를 제안한다. 사용자는 작업(job)과 그 의존성을 정의하면 프레임워크가 자동으로 데이터 분배, 통신, 스케줄링을 수행한다. 구현 결과는 Jacobi 선형 방정식 해석기에 적용했을 때, 전용 MPI 구현 대비 약 10 % 정도의 성능 차이만 보이며, 개발 비용 절감 효과가 크다.
상세 분석
이 프레임워크는 “작업(job)”이라는 가장 작은 실행 단위를 중심으로 설계되었다. 작업은 단일 명령, 루프, 함수 혹은 전체 프로그램까지 포괄할 수 있으며, 입력 데이터는 여러 청크(chunk)로 나누어 제공한다. 사용자는 각 작업에 대해 (1) 호출할 함수 식별자, (2) 필요 스레드 수, (3) 처리할 데이터 청크 수 혹은 이전 작업 결과 참조, (4) 결과 반환 여부 네 가지 매개변수를 지정한다. 이러한 정의만으로 작업 간 의존 관계와 병렬 구성을 완전 기술할 수 있다.
프레임워크는 마스터‑슬레이브 구조를 채택한다. 마스터 스케줄러(rank = 0)는 전체 알고리즘 트리를 보관하고, 서브 스케줄러들에게 작업 할당 정보를 전파한다. 각 서브 스케줄러는 자신이 담당하는 작업 결과를 저장하고, 필요 시 다른 스케줄러에게 결과를 제공한다. 워커 프로세스는 런타임에 동적으로 생성되며, 할당된 작업을 실행하고 결과를 스케줄러에 전달한다. 워커는 메모리리스(memory‑less) 설계를 목표로 하여, 작업이 끝나면 스케줄러의 신호에 따라 데이터를 해제한다. 이 설계는 통신 오버헤드를 최소화하면서도, 작업이 실패했을 경우 재계산이 필요하다는 단점을 가진다.
프레임워크는 현재 ‘fat worker’ 방식을 사용한다. 즉 모든 사용자 정의 함수가 하나의 워커 바이너리에 정적으로 링크된다. 향후에는 동적 함수 로딩을 지원하는 ‘slim worker’를 도입해 GPU나 특수 가속기와의 연계도 가능하도록 설계하고 있다. 데이터 청크는 MPI 데이터 타입과 연계되어 정의되며, 포인터 복사 방식으로 메모리 관리 비용을 낮춘다.
핵심적인 기술적 기여는 다음과 같다. 첫째, 작업 수준에서의 의존성 선언만으로 복잡한 MPI/OpenMP 통신을 자동화한다. 둘째, 작업 내부에서 새로운 작업을 생성할 수 있게 하여 반복적 알고리즘(예: Jacobi 반복)도 자연스럽게 표현한다. 셋째, 스케줄러가 작업별 스레드 수를 조정함으로써 다중 코어와 다중 노드 환경에서 자원을 효율적으로 활용한다.
실험에서는 500번 반복 수행되는 Jacobi 솔버를 2709×2709, 4209×4209, 7209×7209 규모의 행렬에 적용하였다. 프레임워크 기반 구현은 전용 MPI 구현 대비 평균 10 % 정도의 실행 시간 차이를 보였으며, 이는 순차 코드를 거의 그대로 유지하면서도 병렬화를 달성한 결과이다. 성능 격차는 프레임워크가 추가적인 데이터 복사와 스케줄링 오버헤드를 포함하기 때문이며, 향후 최적화 여지가 충분히 존재한다.
전반적으로 이 연구는 엔지니어링 시뮬레이션 분야에서 기존 레거시 코드를 빠르게 하이브리드 병렬 형태로 전환하고자 하는 개발자에게 실용적인 도구를 제공한다는 점에서 의의가 크다.
댓글 및 학술 토론
Loading comments...
의견 남기기