시간의 축

592025년 09월 01일5

새로운 캔버스 모델이 안착하고, 메시 셰이더의 표준화가 순조롭게 진행되면서, WebGPU는 성숙기에 접어들고 있었다. 드미트리는 이제 팀의 일상적인 운영을 카이와 같은 시니어 엔지니어들에게 위임하고, 자신은 한 걸음 물러나 더 장기적인 관점에서 플랫폼의 미래를 고민하고 있었다.

그의 새로운 관심사는 ‘시간’이었다.
더 정확히는, ‘GPU 작업의 동기화(Synchronization)’ 문제였다.

지금까지 WebGPU는 queue.submit()이라는, 비교적 단순한 동기화 모델을 사용해왔다. 개발자는 작업 지시서(Command Buffer)를 큐에 제출하고, 그 작업들이 제출된 순서대로 실행될 것이라고 믿을 뿐이었다. GPU 내부에서 정확히 ‘언제’ 그 작업이 시작되고 끝나는지를 알거나 제어할 방법은 거의 없었다.

대부분의 렌더링 작업에서는 이 정도로도 충분했다. 하지만 복잡한 애플리케이션들은 더 정밀한 제어권을 요구하기 시작했다.

구글의 한 내부 팀이 그에게 자문을 구해왔다. 그들은 웹 기반의 비디오 편집기를 만들고 있었다.
팀의 리드 엔지니어, 사라는 드미트리에게 그들의 파이프라인을 설명했다.

“저희는 여러 단계의 작업을 거칩니다. 먼저 컴퓨트 셰이더로 비디오 디코딩을 가속화하고, 다음 단계의 컴퓨트 셰이더로 색 보정이나 전환 효과 같은 필터를 적용합니다. 마지막으로, 렌더 파이프라인을 통해 최종 결과를 화면에 그리고, 동시에 다른 컴퓨트 셰이더로 결과물을 비디오 파일로 인코딩합니다.”

그것은 여러 개의 WebGPU 작업들이 복잡하게 얽혀있는, 정교한 파이프라인이었다.

사라가 본론을 꺼냈다.
“문제는 이 작업들 사이의 의존성을 관리하는 것입니다. 예를 들어, 색 보정 셰이더는 반드시 디코딩 작업이 완전히 끝난 후에 실행되어야 합니다. 저희는 지금 이 순서를 보장하기 위해, 각 단계를 별도의 submit 호출로 나누고 있습니다. 하지만 이건 매우 비효율적입니다. GPU를 최적으로 활용하려면, 모든 작업을 하나의 submit 호출에 담아서 한 번에 보내는 것이 이상적이지 않습니까?”

그녀의 질문은 WebGPU 1.0의 아킬레스건을 정확히 짚고 있었다.
하나의 submit 호출 안에서는, 모든 작업이 순서대로 실행된다는 보장 외에는 아무런 세부 제어권이 없었다.

드미트리는 이 문제가 비단 비디오 편집기만의 문제가 아님을 알았다. 복잡한 물리 시뮬레이션, 다단계 후처리 효과를 사용하는 게임, 그리고 머신러닝의 추론 그래프 등, 수많은 애플리케이션이 이와 비슷한 ‘파이프라인 장벽(Pipeline Barrier)’ 문제에 부딪히고 있었다.

W3C 회의.
드미트리는 이 문제를 ‘Timeline Synchronization’이라는 이름으로 공식 안건에 올렸다.

“우리는 개발자들에게 GPU의 ‘시간 축’을 직접 제어할 수 있는 도구를 주어야 합니다. 특정 작업이 다른 작업 이전에 반드시 완료되어야 함을 명시할 수 있는 방법이 필요합니다.”

이 제안은 즉시 뜨거운 논쟁을 불러일으켰다.
Vulkan에는 VkSemaphoreVkFence라는 강력한 동기화 기본 요소(Primitive)가 있었다. DirectX 12 역시 비슷한 개념을 가지고 있었다. 하지만 Metal은 조금 다른, 이벤트 기반의 모델을 사용했다.

이 서로 다른 세 개의 시간 관리 모델을, 어떻게 하나의 보편적인 웹 API로 추상화할 것인가?

몇 주간의 논쟁 끝에, 커뮤니티는 두 가지 새로운 개념을 도입하는 방향으로 의견을 모았다.

첫 번째는 GPUFence.
이름 그대로, GPU 타임라인 위에 세우는 ‘울타리’였다. 개발자는 큐에 특정 지점의 ‘울타리 값’을 신호로 보내도록 요청할 수 있다. 예를 들어, queue.signal(myFence, 5)는 모든 선행 작업이 끝난 후, myFence의 값을 5로 업데이트하라는 명령이다.
그리고 다른 쪽에서는 device.wait(myFence, 5)를 통해, 해당 울타리의 값이 5가 될 때까지 기다릴 수 있다.

두 번째는 GPUSemaphore.
세마포어는 울타리와 비슷하지만, 한 큐에서 신호를 보내고 다른 큐에서 기다리는, 큐와 큐 사이의 동기화를 위해 특별히 설계되었다. 예를 들어, 컴퓨트 큐에서 계산 작업이 끝나면 신호를 보내고, 렌더 큐는 그 신호를 받은 뒤에야 비로소 렌더링을 시작할 수 있다.

이 두 가지 새로운 도구는 개발자들에게 전례 없는 수준의 제어권을 부여했다. 그들은 이제 GPU 내부에서 벌어지는 작업들의 복잡한 오케스트라를, 나노초 단위로 직접 지휘할 수 있게 된 것이다.

Dawn 팀은 이 새로운 동기화 프리미티브의 프로토타입 구현에 착수했다.
이것은 단순히 함수 몇 개를 추가하는 작업이 아니었다. GPU 스케줄러의 가장 깊은 곳을 건드려야 하는, 위험하고 섬세한 수술이었다. 잘못 구현하면 시스템 전체를 교착 상태(Deadlock)에 빠뜨릴 수도 있었다.

드미트리는 이 새로운 도구가 가져올 미래를 그리고 있었다.
개발자들은 이제 GPU의 모든 코어를 단 1밀리초의 낭비도 없이 완벽하게 활용할 수 있게 될 것이다. 렌더링과 계산, 비디오 인코딩이 서로를 기다리며 완벽한 하모니를 이루는, 진정한 의미의 이기종 컴퓨팅(Heterogeneous Computing) 시대.

그는 자신들이 만들고 있는 것이 단순한 API가 아니라, 보이지 않는 시간의 흐름을 지배하는, 강력한 마법사의 지팡이와도 같다고 생각했다. 그리고 이 지팡이를 어떻게 사용하느냐에 따라, 웹의 미래는 또 한 번 상상치 못했던 모습으로 변모하게 될 터였다.