시간의 잔상

782025년 09월 10일5

마이크로소프트와의 보이지 않는 경쟁 속에서, 드미트리는 잠시 잊고 있었던 또 다른 전선을 마주하게 되었다. 그것은 W3C의 ‘웹 오디오(Web Audio)’ 워킹 그룹으로부터 온 한 통의 공식 질의서였다.

웹 오디오 팀은 브라우저에서 실시간으로 오디오를 생성하고 처리하는 API를 다루는 곳이었다. 그들이 그래픽스 팀에 연락하는 것은 매우 드문 일이었다.

질의서의 내용은 간단명료했다.
“저희는 오디오 작업(Audio Worklet)의 처리량을 높이기 위해 GPU 가속을 도입하는 방안을 검토하고 있습니다. WebGPU 컴퓨트 셰이더를 오디오 워크릿 내부에서 직접 호출하는 것이 기술적으로 가능합니까? 그리고 만약 가능하다면, 오디오와 비디오 렌더링 사이의 동기화는 어떻게 보장할 수 있습니까?”

이 질문은 드미트리에게 새로운 차원의 복잡성을 안겨주었다.
그는 지금까지 ‘시간의 축’을 그래픽스 파이프라인 내부의 문제로만 생각해왔다. 렌더링 작업과 계산 작업 사이의 순서를 제어하는 문제.
하지만 이제, 완전히 다른 세상인 ‘오디오’의 시간 축이 개입하기 시작한 것이다.

드미트리는 웹 오디오 팀의 리더인 레이먼드와 화상 회의를 진행했다.
레이먼드는 오디오 처리의 까다로움을 설명했다.
“드미트리, 저희에게 시간은 생명입니다. 오디오는 단 몇 밀리초의 지연(Latency)이나 시간 불일치(Jitter)만 발생해도, 사용자는 즉시 ‘소리가 끊긴다’거나 ‘잡음이 들린다’고 느끼게 됩니다. 저희의 모든 시스템은 이 실시간성을 보장하기 위해 설계되었습니다.”

그는 오디오 워크릿의 동작 방식을 설명했다.
“오디오 워크릿은 브라우저의 메인 스레드가 아닌, 별도의 고우선순위 실시간 스레드에서 동작합니다. 이 스레드는 어떤 경우에도 멈추거나 지연되어서는 안 됩니다. 그런데 만약 이 실시간 스레드에서 WebGPU 작업을 호출한다면 어떻게 될까요? GPU 작업이 끝날 때까지 오디오 스레드가 기다려야 한다면, 그건 재앙입니다.”

그의 우려는 정당했다.
WebGPU의 작업 제출 모델은 근본적으로 ‘비동기적’이었다. CPU는 GPU에게 작업을 던져놓고, 그 결과가 언제 돌아올지 정확히 알 수 없었다. 이 예측 불가능성은, 실시간 오디오 처리의 엄격한 시간 제약과 상극이었다.

드미트리는 이 문제가, 그가 이전에 해결했던 GPUFenceGPUSemaphore만으로는 풀 수 없는, 더 깊은 차원의 문제임을 깨달았다.
그것은 바로 ‘시스템 클럭(System Clock)’의 문제였다.

오디오 하드웨어는 자신만의 정밀한 클럭을 가지고 있었다.
GPU 역시 자신만의 내부 클럭으로 동작했다.
그리고 브라우저의 렌더링 루프(requestAnimationFrame)는 디스플레이의 주사율에 맞춰진 또 다른 클럭을 따르고 있었다.

세 개의 서로 다른 시간대가, 각자의 속도로 흘러가고 있었다.
지금까지는 이 시간대들이 서로를 거의 인식하지 못했다. 하지만 이제 웹 오디오 팀의 요구는, 이 세 개의 다른 시간대를 하나의 완벽한 타임라인 위에서 동기화시켜 달라는 것이었다.

“우리가 필요한 것은…” 드미트리가 천천히 입을 열었다. “…타임스탬프(Timestamp)입니다. GPU가 특정 작업을 정확히 ‘언제’ 시작하고 ‘언제’ 끝냈는지를, 나노초 단위의 정밀도로 기록할 수 있는 방법이 필요합니다.”

그는 새로운 API 기능을 구상하기 시작했다.

GPUQueue.writeTimestamp(querySet, queryIndex);

개발자는 작업 큐의 특정 지점에 ‘타임스탬프 기록’ 명령을 삽입할 수 있다.
GPU는 해당 지점을 통과할 때, 자신의 내부 고정밀 카운터 값을 지정된 쿼리셋(QuerySet) 버퍼에 기록한다.
나중에 개발자는 이 버퍼의 값을 읽어와, 두 타임스탬프 간의 차이를 계산함으로써 특정 작업의 정확한 실행 시간을 측정할 수 있었다.

이 기능이 있다면, 웹 오디오 팀은 GPU 계산 작업의 소요 시간을 정확히 예측하고, 그에 맞춰 오디오 버퍼를 미리 준비하는 등의 정교한 스케줄링을 할 수 있게 된다.
더 나아가, 개발자들은 자신들의 WebGPU 코드가 어느 부분에서 시간을 많이 소모하는지를 정확히 파악하여, 이전과는 비교할 수 없는 수준의 정밀한 성능 튜닝을 할 수 있게 될 것이었다.

하지만 이 기능 역시 구현이 쉽지 않았다.
모든 GPU 하드웨어가 나노초 단위의 정밀한 타임스탬프 쿼리를 지원하는 것은 아니었다. 지원하더라도, 그 값을 읽어오는 방식이 제각각이었다.

드미트리는 다시 한번, 서로 다른 하드웨어의 파편화된 현실을 하나의 우아한 API로 통합해야 하는, 익숙하지만 고된 과제 앞에 섰다.

그는 레이먼드에게 약속했다.
“당신들이 제기한 문제는 WebGPU뿐만 아니라, 웹 플랫폼 전체의 실시간 처리 능력을 한 단계 끌어올릴 중요한 열쇠입니다. 우리는 그래픽과 오디오라는 두 세계가, 하나의 정밀한 시간 속에서 함께 춤출 수 있도록 만드는 방법을 찾아낼 겁니다.”

그의 여정은 이제 공간의 축(3D 그래픽)을 넘어, 시간의 축까지 지배하려는 새로운 차원으로 접어들고 있었다. 그는 이제, 브라우저라는 거대한 오케스트라의 모든 파트가 완벽한 박자에 맞춰 연주할 수 있도록, 보이지 않는 시간의 잔상을 조율하는 지휘자가 되어야 했다.