동기화 비용이라는 마지막 그림자까지 걷어내자, WebGPU는 기술적으로 거의 완전체에 가까워 보였다. 브라우저는 이제 GPU의 모든 힘을, 가장 깊은 곳까지, 가장 효율적인 방식으로 활용할 수 있게 되었다. 드미트리는 이제 당분간은 평화가 찾아올 것이라고 생각했다.
그의 예상을 깬 것은, 이번에도 기술의 최전선이 아닌, 웹의 가장 근본적인 철학과 맞닿아 있는 곳에서 시작되었다. 바로 자바스크립트 언어 자체의 진화를 책임지는 TC39 위원회였다.
TC39 위원회는 최근, 자바스크립트의 동시성(Concurrency) 문제를 해결하기 위한 새로운 제안을 논의하고 있었다. 웹 워커(Web Worker)는 훌륭한 해결책이었지만, 워커를 생성하고 통신하는 데 드는 비용이 적지 않았고, 메모리를 공유할 수 없는 한계가 있었다.
그들이 내놓은 대안 중 하나는, ‘가상 스레드(Virtual Thread)’ 또는 ‘프로젝트 룸(Project Loom)’과 같은 다른 언어의 개념에서 영감을 받은, 훨씬 더 가볍고 효율적인 동시성 모델에 대한 초기 탐색이었다.
이 논의를 지켜보던 한 브라우저 아키텍트가, WebGPU 커뮤니티에 도발적인 질문을 던졌다.
“만약 미래의 자바스크립트가, 수백, 수천 개의 가상 스레드를 손쉽게 생성하고 관리할 수 있게 된다면, WebGPU의 API 모델은 여전히 유효할까요?”
이 질문은 드미트리의 허를 찔렀다.
WebGPU의 API는 기본적으로 ‘단일 스레드’를 가정하고 설계되었다.
GPUDevice
와 같은 핵심 객체들은 스레드에 안전하지 않았고, 여러 스레드에서 동시에 접근할 경우 예측 불가능한 결과를 낳을 수 있었다. 개발자들은 WebGPU 관련 작업을 모두 메인 스레드나, 단 하나의 웹 워커 안에서 처리해야 한다는 암묵적인 제약이 있었다.
하지만 만약, 수천 개의 스레드가 동시에 queue.submit()
을 호출하고, 동시에 파이프라인을 생성하려고 한다면?
현재의 Dawn 엔진은 그 혼돈을 감당할 수 없었다. 시스템 전체가 교착 상태에 빠지거나, 데이터가 손상될 것이 뻔했다.
드미트리는 깨달았다.
그들은 지금까지 GPU의 병렬성을 극대화하는 데만 집중한 나머지, 그 GPU를 제어하는 CPU 측, 즉 자바스크립트의 병렬성에 대해서는 너무나 안일하게 생각해왔다는 것을.
이것은 WebGPU의 아키텍처를 다시 한번 뒤흔드는, 거대한 지각 변동의 전조였다.
Dawn 팀의 회의실.
“우리는 선택의 기로에 섰습니다.”
드미트리가 말했다.
“이 문제를 무시하고, ‘WebGPU는 단일 스레드에서만 사용해야 한다’는 가이드를 고수할 수도 있습니다. 하지만 그건 웹의 미래에 역행하는 길입니다. 우리는 자바스크립트의 진화에 발을 맞춰야 합니다.”
그는 새로운 목표를 제시했다.
“Dawn 엔진의 모든 것을, 처음부터 끝까지, ‘스레드 세이프(Thread-Safe)’하게 만들어야 합니다.”
그 선언에, 회의실은 침묵에 잠겼다.
팀원들은 그 말의 무게를 누구보다 잘 알고 있었다. 그것은 단순히 몇 개의 뮤텍스(Mutex) 락을 추가하는 수준의 일이 아니었다.
수십만 줄에 달하는 코드베이스의 모든 전역 변수, 모든 공유 자원, 모든 객체의 생명 주기를 다시 검토하고, 여러 스레드에서 동시에 접근해도 안전하도록 구조를 뜯어고치는 대수술이었다.
카이가 우려를 표했다.
“드미트리, 그건… 거의 Dawn을 새로 쓰는 것과 같은 작업입니다. 그리고 과도한 락은 오히려 성능을 심각하게 저하시킬 수 있습니다. 우리는 스레드 안전성을 얻는 대가로, 우리가 지금까지 쌓아 올린 모든 성능 최적화를 잃어버릴 수도 있습니다.”
“알고 있소, 카이.”
드미트리가 그의 눈을 바라보았다. “그래서 우리는 단순한 락킹 이상의 것을 생각해야 해.”
그는 ‘락-프리(Lock-Free) 프로그래밍’과 같은, 현대 병렬 컴퓨팅의 가장 어려운 주제들을 꺼내 들었다. 여러 스레드가 락 없이도 데이터를 안전하게 공유할 수 있는, 원자적 연산(Atomic Operations)과 정교한 메모리 모델을 기반으로 한 아키텍처.
이것은 Dawn 팀의 기술적 역량을 극한까지 시험하는 도전이었다.
그들은 이제 그래픽스 엔지니어를 넘어, 운영체제 커널 개발자와 같은 수준의 저수준 동시성 전문가가 되어야 했다.
팀의 일부는 이 거대한 재설계 작업에 착수했다. 그들은 엔진의 가장 깊숙한 곳부터, 마치 낡은 건물의 배관을 교체하듯, 스레드에 안전하지 않은 모든 구조를 하나씩 걷어내기 시작했다.
이 작업은 사용자에게 즉시 눈에 띄는 새로운 기능을 제공하지 않았다. 벤치마크 점수를 높여주지도 않았다.
그것은 마치 도시의 지하에, 미래의 거대한 교통량을 감당할 수 있는 새로운 지하철 터널을 미리 뚫어놓는 것과 같은, 보이지 않는 투자였다.
드미트리는 TC39 위원회에 공식적인 의견을 전달했다.
“WebGPU 커뮤니티는, 미래의 자바스크립트가 가져올 대규모 병렬성의 시대를 환영하며, 그에 대비한 준비를 시작했습니다. 저희는 웹 플랫폼의 모든 부분이, 서로의 발목을 잡는 대신, 함께 진화해야 한다고 믿습니다.”
그의 메시지는, WebGPU가 더 이상 그래픽이라는 고립된 섬이 아니라, 자바스크립트라는 거대한 대륙의 변화와 함께 호흡하고 진동하는, 살아있는 일부가 되었음을 선언하는 것이었다.
그의 여정은 이제, 기계의 언어를 넘어, 그 기계를 움직이는 프로그래밍 언어 자체의 진화와 보조를 맞추는, 가장 근본적인 차원의 도전으로 나아가고 있었다.