돌이켜보면 대학교 2학년 때 이재진 교수님의 멀티코어 컴퓨팅 수업을 들은 게 계기였던 것 같다. 클러스터에 대한 고려 없이 한 노드만을 고려하여 작성된 OpenCL 프로그램이 SnuCL을 통해 클러스터에서 실행되는 건 꽤나 매력적이었다. 지금도 SnuCL 논문을 그래서 가장 좋아한다. 그리고 이 철학은 지금 내 박사과정의 연구 철학과 궤를 같이 한다. 이십여년 전 델라웨어 대학 연구팀에서부터 Codelet 프로그래밍이란 명칭으로 내려와, 미 정부 X-Stack 프로그램을 통해 인텔 진영의 OCR을 거쳐, 현재는 내가 속한 PNNL 연구팀으로 이어져 오고 있는 연구 철학이다.

공유 메모리 시스템에서는 1980년대부터 2000년대 초반까지 소프트웨어 스택에서부터 아키텍처 솔루션에 이르기까지 모든 계층에서 연구방향이 탐구되어 오늘날의 페이징, 캐싱, 코히어런시 등이 보장된다. 프로그래머들은 (또는 AI agent들은) 마음 편하게 공유 메모리와 멀티코어 정도만 가정하고 캐시 친화적으로 (e.g., false sharing 회피, locality 고려) 프로그램을 작성하면 된다. 하지만 분산 메모리 시스템은 이런 방향이 성과를 잘 내지 못했다. TreadMarks 같은 소프트웨어 DSM이 페이지 단위로 coherence를 붙여봤지만 동기화 지연을 못 이기고 죽었고, MPI 말고 UPC나 Chapel 같은 PGAS라는 길도 있었지만 결국 데이터를 다시 선언하고 put과 get을 직접 부르는 건 그대로였다. 그 시대에 연구를 한 게 아니라서 잘 와닿지는 않지만 어려움이 매우 많았던 것 같다. 엔지니어와 시장의 선택은 시스템적 해결법보단 예전부터 계속 하던 소위 프로그래머에게 책임 떠넘기기였다. MPI는 1990년대에 탄생했지만, 지금까지도 우리는 MPI에서 벗어나지 못한다. GPU 간 통신, 다른 아키텍처 간 통신 등 전부 MPI의 파생이다. 우리는 이 MPI가 불편하다. 프로그래머와 AI agent들에게 부담을 덜어내주고 싶고, 그들이 순전히 과학과 쓰레드 간 (또는 후술할 태스크 간) 의존성만 고려해, 물리계층을 고려하지 않고 논리계층만을 기술하게 하고, 그것이 랩탑에서부터 엑사스케일 슈퍼컴퓨터에 이르기까지 어디서나 돌게끔 하고자 한다.

물리계층을 감추고 Programmability (한국말로는 프로그래밍 용이성 정도로 해석될 수 있겠다)를 향상하면서 성능은 최대한 보장하는 연구를 우리 연구팀은 이십여년 동안 세대를 거듭해 꾸준히 해오고 있다. 상당히 도전적이고 어려운 고전적 HPC 연구이다. 하지만 나는 이 연구가 매우 중요하다는 것을 안다. 목표는, 우리의 컴파일러를 통해 변환된 기존의 수십년 전 프로그램들이, 우리의 런타임과 결합해 슈퍼컴퓨터를 비롯한 모든 종류의 디바이스에서 돌도록 하는 것이다. 성능 때문에 죽은 옛 시도들과 달리 우리에겐 Event와 EDT, DB의 조합이 있고 컴파일러가 이를 받쳐준다. 이번에는 될 것이라는 자신감이 있다.

클러스터에서 매우 큰 Context Switch 오버헤드, 모든 동기화 연산이 애플리케이션이 아닌 런타임에 의해 관리되도록 하기 위한 Event와 Event-Driven Task (EDT)의 도입, 메모리 모델에 대한 고찰, 코히어런스 프로토콜의 부재, 공유 메모리 프로그램을 그대로 사용하기 위한 Data Block (DB)의 도입, 컴파일러의 메모리 접근 패턴 분석을 통한 DB 자동 생성, Continuation Passing Style (CPS) 변환, OpenMP로의 인터페이스 확장, Disaggregated Memory System과 GPU에 대한 지원 등 후술할 사항들과 해결해야할 난제들이 쌓여있다. 시간이 날 때마다 하나씩 다뤄보겠다.