명령을 담는 그릇

5

발행일: 2025년 08월 05일

NXT 프로젝트에 시동이 걸린 연구실은 조용한 열기로 가득 찼다. 화이트보드는 ‘Adapter’와 ‘Device’를 중심으로 뻗어 나가는 다이어그램으로 빼곡했다. 초기 개념 설계는 끝났다. 이제는 뼈대에 살을 붙여야 할 시간. 진짜 논쟁은 지금부터였다.

가장 먼저 부딪힌 질문은 단순하면서도 근본적이었다.
“그래서, 우리가 얻은 ‘Device’에게 어떻게 그림을 그리라고 명령하죠?”

팀의 시니어 엔지니어, 카이가 입을 열었다. 그의 질문은 팀 모두의 머릿속에 맴돌던 것이었다.

“WebGL처럼 device.setVertexBuffer(...), device.drawArrays(...) 같은 함수를 호출하면 되는 걸까요? 하지만 그건 결국 예전 방식으로 돌아가는 것 아닙니까?”

그의 말에 연구실의 공기가 무거워졌다. 그랬다. 만약 Device에 직접 명령을 내린다면, 그건 결국 CPU가 GPU에게 하나하나 지시하는 WebGL의 모델과 다를 바 없었다. 이름만 바뀐 채 똑같은 병목 현상을 겪게 될 것이 뻔했다.

모두의 시선이 드미트리에게로 향했다. 그는 잠시 눈을 감고 생각에 잠겼다가, 이내 화이트보드로 다가가 기존의 다이어그램 옆에 새로운 그림을 그리기 시작했다.

“우리는 GPU와 직접 대화하지 않을 겁니다. 적어도, 실시간으로는요.”

드미트리의 말에 모두가 의아한 표정을 지었다. GPU를 쓰기 위한 API를 만들면서 GPU와 대화하지 않겠다니. 모순처럼 들렸다.

드미트리는 아랑곳하지 않고 말을 이었다.
“WebGL의 가장 큰 문제는 CPU가 명령을 내릴 때마다 GPU가 즉시 반응해야 한다는 점입니다. CPU가 ‘이 텍스처를 사용해’라고 말하면, GPU는 하던 일을 멈추고 그 명령을 처리해야 하죠. 이런 실시간 통신이 바로 오버헤드의 주범입니다.”

그는 화이트보드에 ‘CPU’와 ‘GPU’라는 단어를 멀찍이 떨어뜨려 썼다.

“우리는 이 둘 사이에 완충 지대를 만들 겁니다. 일종의 ‘작업 지시서’ 시스템이죠.”

그는 두 단어 사이에 세 개의 새로운 상자를 그렸다.

“첫 번째 상자는 ‘Command Encoder’입니다.”
그가 첫 번째 상자를 가리켰다.
“이름 그대로, ‘명령 기록관’입니다. 우리는 GPU에게 내리고 싶은 모든 명령—어떤 셰이더를 쓸지, 어떤 데이터를 쓸지, 그리고 무엇을 그릴지—을 이 기록관에게 순서대로 알려줍니다. 중요한 건, 이 단계에서는 어떤 명령도 GPU로 전송되지 않는다는 겁니다. 그저 지시 내용을 받아 적기만 할 뿐이죠.”

팀원들의 눈빛이 조금씩 달라지기 시작했다.

“모든 지시 사항을 다 기록했다면, 기록관에게 ‘기록 완료’를 선언합니다. 그러면 기록관은 지금까지 받아 적은 모든 내용을 하나의 묶음으로 만들어 우리에게 돌려줍니다. 그것이 두 번째 상자, ‘Command Buffer’입니다.”

그는 Command Buffer 상자에 별표를 쳤다.
“Command Buffer는 한번 만들어지면 절대 수정할 수 없는, 완성된 작업 지시서입니다. GPU가 수행해야 할 모든 작업이 처음부터 끝까지 담겨있죠.”

이제 마지막 상자만 남았다.
“마지막으로, 우리는 이 완성된 Command Buffer를 세 번째 상자, ‘Queue’에 던져 넣습니다.”

드미트리는 CPU에서 Queue로 향하는 화살표를 그렸다.
“Queue는 일종의 우체통입니다. CPU는 잘 정리된 작업 지시서(Command Buffer)를 이 우체통에 넣어두기만 하면 됩니다. 그 즉시 CPU의 임무는 끝납니다. CPU는 이제 자유롭게 다른 일—물리 계산이든, UI 업데이트든—을 처리할 수 있습니다.”

그는 마지막으로 Queue에서 GPU로 향하는 굵은 화살표를 그렸다.
“GPU는 자신이 한가해질 때마다 이 우체통을 확인합니다. 그리고 작업 지시서가 들어 있으면, 통째로 가져다가 자신에게 가장 효율적인 방식으로 모든 명령을 일괄 처리합니다. CPU의 간섭 없이요.”

설명이 끝나자 연구실에는 짧은 정적이 흘렀다. 이내 여기저기서 낮은 감탄사가 터져 나왔다.
“CPU와 GPU의 작업을 완벽하게 분리하는군요.”
“이 방식이라면 CPU는 명령을 준비하는 동안 전혀 기다릴 필요가 없겠어요.”

카이가 고개를 끄덕이며 말했다.
“알겠습니다. 우리는 GPU를 직접 제어하는 게 아니라, GPU가 실행할 ‘작업 목록’을 설계해서 전달하는 거군요. 패러다임 자체가 다릅니다.”

드미트리는 만족스러운 미소를 지었다.
“바로 그겁니다. 우리는 더 이상 GPU의 마이크로매니저가 아닙니다. 우리는 건축 설계사와 같죠. 완벽한 설계도(Command Buffer)를 그려서 현장 감독(GPU)에게 넘겨주면, 그 뒤는 감독이 알아서 최고의 건물을 짓는 겁니다.”

NXT의 핵심 철학이 마침내 구체적인 아키텍처로 완성되는 순간이었다. Adapter와 Device로 사용 허가를 받고, Command Encoder와 Queue를 통해 작업을 지시한다. 이 네 개의 기둥 위에, 웹 그래픽의 새로운 신전이 세워질 것이었다. 이제 남은 것은 이 설계도를 실제 코드로 증명해 보이는 일뿐이었다.