공유 메모리 시스템에서는 소프트웨어와 하드웨어에 걸친 연구를 통해 메모리 관리와 캐시 코히어런시 같은 기능이 발전해왔다. 프로그래머는 공유 주소 공간을 바탕으로 프로그램을 작성할 수 있다. 동기화의 정확성과 false sharing, locality 같은 성능 문제는 여전히 고려해야 하지만, 데이터가 오갈 때마다 통신을 직접 기술할 필요는 없다.
분산 메모리 시스템에서도 TreadMarks 같은 소프트웨어 DSM이나 UPC, Chapel 같은 언어를 통해 프로그래밍을 쉽게 하려는 시도가 이어져왔다. 다만 노드 간 통신과 동기화 비용을 감추면서 성능까지 확보하는 일은 어렵다. 데이터 배치와 통신을 프로그래머가 어디까지 명시하고, 시스템이 어디까지 맡을 것인가는 여전히 중요한 문제다.
내가 관심을 두고 있는 것도 이 문제다. 프로그램에서는 계산과 태스크 간 의존성을 기술하고, 하드웨어에 따른 실행 배치와 데이터 이동은 컴파일러와 런타임이 맡게 할 수 있을까. 같은 프로그램을 랩탑부터 슈퍼컴퓨터까지 실행하면서, 각 환경에서 성능도 확보하는 것이 목표다.
SnuCL도 비슷한 문제의식을 가진 연구다. 한 노드를 대상으로 작성한 OpenCL 프로그램을 클러스터 전체에서 실행할 수 있게 한다는 점에서 연결된다.
현재 PNNL에서 참여하고 있는 연구는 Codelet 실행 모델과 OCR로 이어져 온 태스크 기반 접근을 따른다. 하드웨어의 세부 사항을 추상화해 프로그래밍을 쉽게 하면서도 성능을 확보하려는 연구다.
구체적으로는 컴파일러가 기존 프로그램을 Event, Event-Driven Task (EDT), Data Block (DB)으로 표현하고, 런타임이 이를 실행하는 구조를 다룬다. 이 과정에서 기존 프로그램의 의미를 보존하고, 변환과 실행에 드는 비용을 줄이는 것이 과제다.
다룰 주제는 태스크 실행과 문맥 전환 비용, Event를 통한 의존성과 동기화 관리, 분산 환경의 메모리 모델과 코히어런시, 메모리 접근 패턴 분석을 통한 DB 자동 생성 등이다. Continuation Passing Style (CPS) 변환, OpenMP 인터페이스, Disaggregated Memory System과 GPU 지원도 함께 살펴볼 예정이다.
시간이 날 때마다 하나씩 다뤄보겠다.