Show HN: Eyot, GPU가 또 다른 스레드에 불과한 프로그래밍 언어

발행: (2026년 3월 8일 PM 08:04 GMT+9)
9 분 소요

Source: Hacker News

개요

Eyot 은 GPU에 작업을 오프로드하는 과정을 백그라운드 스레드를 생성하는 것만큼 간편하게 만들기 위해 제가 개발 중인 새로운 언어입니다.

Eyot 소스 코드는 CPU와 GPU 모두에서 투명하게 컴파일되며, 두 환경 간의 통신은 런타임이 담당합니다. 기존 GPU 프로그래밍에서는 메모리 할당, 커널 컴파일, 작업 스케줄링 등 많은 작업을 직접 처리해야 했지만, 이러한 작업들은 CPU 코드를 작성할 때 이미 언어 런타임에 의해 처리되어 왔습니다. Eyot 은 그 편리함을 GPU용 코드에도 확장합니다.

주 대상 사용자는 게임 개발, 수치 해석, 인공지능 등 GPU 또는 기타 가속기를 많이 활용하는 분야에 종사하는 사람들입니다.

Eyot 은 아직 초기 단계이며 실제 작업에 바로 사용하기엔 부족합니다. 하지만 실험해 보실 수 있고, 사용해 보신 후 의견을 주시면 감사하겠습니다. 간단한 예제를 살펴보면 ( playground 에서 확인 가능) :

fn square(value i64) i64 {
   print_ln("square(", value, ")")
   return value * value
}

cpu fn main() {
    // 1. 직접 호출
    print_ln("square(2) on cpu = ", square(2))

    // 2. CPU 워커로 호출
    let cpu_worker = cpu square
    send(cpu_worker, [i64]{ 3 })
    print_ln(receive(cpu_worker))

    // 3. GPU 워커로 호출
    let gpu_worker = gpu square
    send(gpu_worker, [i64]{ 4, 5, 6 })
    print_ln(receive(gpu_worker))
}
  • square 함수는 기대한 대로 직접, 그리고 CPU에서 호출됩니다.
  • CPU 워커square 함수로부터 생성됩니다 (let cpu_worker = cpu square). 이 워커는 send 함수를 통해 전달된 값을 백그라운드 CPU 스레드에서 처리하고, 제곱 연산 후 receive 호출을 통해 결과를 반환합니다.
  • 이번에는 GPU 워커가 생성됩니다 (let gpu_worker = gpu square). 이 경우 square 함수가 커널로 컴파일되어 GPU에서 실행되지만, 동작 방식은 CPU 워커와 동일합니다. 보시다시피 Eyot 의 print_ln도 GPU 측에서 정상적으로 동작합니다.

Motivation

GPU로 계산을 옮기는 것이 명백히 성능을 향상시킬 수 있는 경로임에도 불구하고, 구현 난이도 때문에 무시된 프로젝트들을 많이 진행해 왔습니다. 이러한 프로젝트들은 컴퓨터 비전이나 게임 개발 같은 명백한 분야뿐만 아니라, 데스크톱 애플리케이션 개발처럼 GPU 프로그래밍과는 잘 맞지 않을 것 같은 분야에서도 있었습니다.

예를 들어, 제가 Texifier라는 macOS LaTeX 편집기를 작업할 때, 전통적인 TeX 조판 시스템을 조정하여 PDF를 생성하는 대신 다각형을 직접 GPU 메모리로 출력하도록 했습니다. 이로 인해 지연 시간이 크게 감소하여 실시간으로 출력물을 업데이트할 수 있었습니다. 이 기능은 인기를 끌었지만, 구현 난이도가 높아 프로젝트 자체가 가치가 있는지 고민하게 만들었습니다.

Eyot와 함께 저는 GPU 작업이 언어 설계에 깊이 내재되어 거의 자동화되는 언어를 만들고 싶습니다. 오랫동안 우리는 CPU/OS 조합을 코드를 실행하는 장치로만 생각했지만, Eyot은 이를 GPU까지 확장합니다. CUDA와 같은 옵션도 존재하지만, Eyot에서는 GPU 동시성 모델을 중심으로 전체 언어를 설계하는 것이 목표입니다.

현재 상황

진행 속도가 느립니다. 여가 시간에 작업하고 있기 때문이며(후원자분들 환영합니다!), 최근에는 새 아기가 태어나 잠시 쉬었습니다. 주요 로드맵 항목은 다음과 같습니다:

  • 렌더링 – Eyot은 현재 GPU에 대한 계산용 접근만을 지원합니다. 게임 개발이 큰 목표이므로 렌더링 지원을 강력히 원합니다. Vulkan을 사용하고 동시에 OpenCL을 Vulkan 컴퓨트로 교체하려고 합니다.
  • 구문 – Eyot의 구문 개발을 미뤄 CPU/GPU 상호작용을 실험할 수 있게 했습니다. 주요 누락된 구문 기능은 대수 데이터 타입, 람다, 그리고 인터페이스/트레이트 스타일 다형성 형태입니다.
  • GPU 메모리 관리 – 현재 벡터와 문자열은 CPU 측에서만 할당할 수 있습니다; 이는 GPU에서도 작동해야 합니다. 또한 메모리 관리자가 적절할 때 할당을 공유 버퍼로 투명하게 이동할 수 있기를 바랍니다.
  • 성능 – *“작동하게 만들고, 올바르게 만들고, 빠르게 만들라”*는 원칙을 따르며, 당분간은 이 부분을 미룰 가능성이 높지만 곧 실제 워크로드를 Eyot에 적용해 속도를 높이고 싶습니다.
  • 표준 라이브러리 – 현재 라이브러리는 몇 개의 함수만 포함하고 있습니다; 시작이 필요합니다.

제가 작업하지 않을 사항들

  • 자동 병렬화 – Eyot은 CPU/GPU 코어 간 작업을 자동으로 병렬화하지 않으며, 앞으로도 그렇게 하지 않을 것입니다. 목표는 프로세서 간 작업 분배를 편리하게 하는 옵션을 제공하는 것이지, 제어를 감소시키는 것이 아닙니다.
  • 이론적으로 최적의 성능 – Eyot은 현재 GPGPU 라이브러리를 완전히 대체하려는 것이 아니며, C/C++가 어셈블리를 완전히 대체하려는 것과 같은 맥락이 아닙니다. Eyot 코드와 동등한 C/Vulkan 코드 사이에 큰 성능 차이가 있다면 버그로 간주되지만, 사용 편의성을 위해 어느 정도 성능 저하를 감수하는 것은 허용됩니다.
  • 다음 위대한 범용 언어가 되는 것 – GPU와 CPU 간 구문 차이를 가능한 최소화할 것이므로, 언어 설계는 GPU 기능에 제한을 받게 되며 이는 Eyot 구문에 추가할 수 있는 것들을 제한할 수 있습니다.

추가 읽기

읽어 주셔서 감사합니다. Eyot에 대해 더 알고 싶다면 문서소스 코드를 확인하세요. 직접 사용해 보고 싶다면 이슈를 열거나 댓글을 남겨 주세요!

0 조회
Back to Blog

관련 글

더 보기 »