TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 34 READS

데이터 병렬 커널을 위한 작은 컴파일러, 직접 만들어보면 보이는 것들

“컴파일러를 직접 만들어본다”고 하면 보통 엄청 어렵고 거창한 일처럼 느껴지죠. 그런데 꼭 C++이나 자바 같은 거대한 언어를 처리해야만 컴파일러인 건 아니에요. 아주 작고 특수한 목적의 컴파일러를 만들어보면, 컴파일러가 도대체 안에서 무슨 일을 하는지 손에 잡히게 이해할 수 있거든요. 오늘 소개할 건 ‘데이터 병렬 커널’을 위한 작은 컴파일러를 직접 만들어본 이야기예요.

‘데이터 병렬 커널’이 뭐냐면

용어가 좀 무섭게 들리죠? 하나씩 풀어볼게요. 커널(kernel)은 여기서 운영체제 커널이 아니라, “배열의 원소 하나하나에 똑같이 적용되는 작은 계산 함수”를 말해요. 예를 들어 “이미지의 모든 픽셀을 두 배 밝게 해라” 같은 거요.

데이터 병렬(data-parallel)은 이 계산을 여러 데이터에 동시에 적용한다는 뜻이에요. 픽셀 100만 개를 하나씩 순서대로 처리하면 느리지만, ‘같은 연산을 여러 데이터에 한꺼번에’ 돌리면 훨씬 빠르거든요. 이게 바로 GPU가 잘하는 일이고, CPU에서도 SIMD(Single Instruction Multiple Data, 명령어 하나로 여러 데이터를 동시에 처리)라는 기능으로 비슷하게 할 수 있어요. 그러니까 이 컴파일러는 “이런 계산을 데이터마다 해줘”라고 적은 간단한 코드를, 실제로 빠르게 병렬 실행되는 형태로 바꿔주는 도구인 셈이죠.

작은 컴파일러는 안에서 무슨 일을 할까

이런 컴파일러도 큰 컴파일러랑 뼈대는 똑같아요. 보통 이런 단계를 거치거든요.

먼저 렉서(lexer)가 소스 코드 문자열을 토큰이라는 의미 단위로 잘게 쪼개요. a + b 2 같은 코드를 a, +, b, , 2 같은 조각으로 나누는 거죠. 그다음 파서(parser)가 이 토큰들을 문법 구조에 맞춰 트리 모양으로 엮어요. 이걸 추상 구문 트리(AST)라고 부르는데, 곱셈을 덧셈보다 먼저 한다는 우선순위 같은 게 이 트리 구조에 자연스럽게 담겨요.

트리가 만들어지면 이제 코드 생성(codegen) 단계예요. 이 트리를 돌면서 실제로 실행될 형태, 예를 들면 가상 머신이 읽는 바이트코드나 CPU가 바로 도는 기계어 비슷한 걸로 바꾸는 거죠. 데이터 병렬 커널 컴파일러의 묘미는 바로 이 단계에서, 하나의 계산식을 여러 데이터에 반복 적용하도록 루프를 깔고 가능하면 SIMD나 스레드로 병렬화하는 코드를 뽑아낸다는 데 있어요.

이렇게 직접 만들어보면, NumPy가 배열 연산을 어떻게 그렇게 빨리 하는지, CUDA 커널이 어떤 원리로 도는지가 머릿속에 그림으로 그려지기 시작해요. 평소 라이브러리가 ‘마법처럼’ 처리해주던 일의 속을 들여다보는 셈이죠.

비슷한 도구들과 비교하면

사실 이 분야엔 이미 유명한 실전 도구들이 많아요. 구글의 할라이드(Halide)는 이미지 처리 커널을 “무엇을 계산할지”와 “어떻게 최적화할지”를 분리해서 짜는 걸로 유명하고, 오픈AI의 트리톤(Triton)은 파이썬으로 GPU 커널을 쉽게 짤 수 있게 해줘서 요즘 딥러닝 쪽에서 인기가 많아요. 또 JAX가 쓰는 XLA, 머신러닝 모델을 다양한 하드웨어용으로 컴파일하는 TVM, 파이썬 문법으로 고성능 커널을 노리는 모조(Mojo) 같은 언어도 같은 고민을 풀고 있죠.

이런 거대한 도구들은 당장 갖다 쓰기엔 좋지만, 내부 원리를 배우기엔 너무 복잡해요. 그래서 작은 컴파일러를 직접 만들어보는 게 교육적으로 가치가 큰 거예요. 큰 도구들이 하는 일을 손바닥만 한 크기로 압축해서 경험할 수 있으니까요.

한국 개발자에게는?

요즘 ML 인프라나 고성능 컴퓨팅 쪽 채용이 늘면서, ‘모델을 빠르게 돌리는’ 역량이 점점 중요해지고 있어요. GPU 커널을 직접 최적화하거나 추론 속도를 끌어올리는 일은 단순히 라이브러리 호출만으로는 한계가 있거든요. 컴파일러가 코드를 어떻게 변환하고 병렬화하는지 원리를 알면, 성능 병목을 진단하고 최적화하는 감각이 확 달라져요.

꼭 컴파일러 엔지니어가 아니어도 좋아요. 주말에 200~300줄짜리 작은 컴파일러를 직접 만들어보는 것만으로도, 평소 추상적으로만 알던 개념들이 구체적인 코드로 연결되는 경험을 할 수 있거든요. 이런 사이드 프로젝트 하나가 면접 자리에서 의외로 강한 무기가 되기도 하고요.

정리하며

핵심은, 작은 컴파일러 하나를 끝까지 만들어보면 ‘NumPy도 GPU도 결국 코드 변환의 결과물’이라는 큰 그림이 보인다는 거예요. 마법처럼 보이던 것들이 원리로 이해되는 순간이죠.

여러분은 컴파일러를 직접 만들어본 적 있으세요? 만약 작은 걸 하나 만든다면 어떤 언어나 계산을 다루는 컴파일러를 만들어보고 싶으세요?


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://healeycodes.com/a-tiny-compiler-for-data-parallel-ke...
SHARE
처리 중...