brunch

You can make anything
by writing

C.S.Lewis

by 상윤 Feb 16. 2024

GPU 잔혹사 1. 서론

목매달리거나 제거당한 device, 그걸 지켜보는 나

나는 어릴 적 꿈에 이끌려 어느 게임 개발사의 엔진 개발팀에 몸 담고 있다. 여기까지 오기 위해서 지나간 역사는 가끔 회고록 연작에 써 내려갈 터라 여기서는 생략하되, 짧게 말하자면 이렇게까지 고생하려고 헤쳐온 길은 아니었다. 이 글을 읽는 여러분은 혹시 주변에 프로그래머라는 직업에 종사하는 인물이 계실지 모르겠다. 요즘은 아무래도 이쪽 직군이 인기가 많다 보니 족히 몇 명쯤은 있을 수도 있겠다. 하지만 아마 내가 소개할 ‘그래픽 렌더링 시스템’ 프로그래머는 만나본 적도, 뭘 하는 사람인지도 잘 모를 것이다.


그래픽 렌더링이란 디스플레이 화면에 뭐든 보여내는 것을 말한다. 그게 3D면 3D 그래픽 렌더링이라는 정식 명칭이 쓰이는 거고. 나는 대충은 둘 다 할 수 있으니까 차원적인 표현은 생략할 수 있을 것이다. 그리고 원래 나도 그쪽 일에 좀 더 매진하고 싶었다. 하지만 중요한 단어란 대개 뒤에 놓이는 법. 시스템이란 단어에 비중이 좀 더 놓여있는 나는 화면에 나타나는 무언가를 처리하는 일보단 그걸 체계화하는 일에 좀 더 힘을 쓰고 있다.


잠깐 이 쪽 분야의 역사를 얘기하자면, 세상 혼탁한 태초에 CPU란 것이 존재해서 고오급지게 모든 일들을 능히 해낼 수 있었다. 하지만 그런 고귀하신 존재께선 당연히 가격도 존귀하셔서 ‘끕’ 떨어지는 화면 픽셀 한 땀 한 땀에 빨초파의 색깔을 정하는 일 따위는 저렴한 노동 인부용 칩들에게 맡겨 담당케 하는 것이 당연한 이치라 할 수 있다. 그렇게 사회는 각자의 위치에서 정해진 역할에 따라 노오력을 해오며 나아가고 있었다.


그러나 전 세계 유수의 천재들이 계산하고 싶어 하는 것이란 대체로 비슷비슷한데 다만 양이 무수히 많다는 것을 알아버렸다. 즉, 수많은 물량을 얼마나 빨리 쳐내는지가 중요한 시대로 접어든 것이다. 그 말이 뜻하는 바는 무엇인가. 다굴엔 장사 없다란 소리다. CPU가 아무리 똑똑한들 많아봐야 한 PC나 워크스테이션에 십 여 개 정도 설치할 수 있건만, 값싸더라도 그래픽카드 안에 꽂힌 무수히 많은 칩들을 부리면 적게는 수배에서 수백에 이르는 시간적 이득을 볼 수 있었다. 그렇게 값싼 잡부였던 그래픽카드는 GPU라는 이름으로 환골탈태하기에 이른다.


오히려 이렇게 상황이 역전되고 나서 보아하니, 이제 CPU가 GPU에게 일을 맡기는데 들어가는 부분이 병목인데, 그 지점들이 눈에 거슬렸나보다. 대체 무슨 일을 하기에 CPU가 느리다고 지적을 받는 날이 온 걸까? 세상 모든 프로그램이 저마다 생김새가 다르고 개성이 다른데 만능 보모로 전락한 CPU가 가지고 있던, 이 금쪽이들을 어르고 달래는 매뉴얼이 너무 복잡해서 이걸 일일이 따르느라 세월 다 보내고 있던 것임이 밝혀졌다. 그저 과자를 달라고 칭얼대는 금쪽이를 두고, 과자 대신 아이스크림을 달라고 할지도 몰라, 라면을 안 주면 현기증을 낼지도 모르지 하는 모든 경우의 수를 다 따지고 있는 건 분명 시간 낭비인 것 아니겠는가. 멀찍이서 보아하니 저 매뉴얼은 나쁜 매뉴얼임이 분명했다.


그렇게 CPU가 원래 들고 있던 고전적인 매뉴얼을 빼앗고, 프로그래머 각각에겐 CPU에게 줄 매뉴얼을 직접 작성하라는 급진적인 사상이 AMD에서 싹트기 시작했다. 그리고 곧 이는 마이크로소프트라는 앞잡이들을 통해 차용되어 세상에 뿌리내리기 시작했으니 이것이 바로 온갖 버그와 크래시, 요즘 세상에 보기 드문 블루스크린의 재 강림을 도모한 명시적 API의 시작이었다.


명시적 API에서 API라는 말은 ’ 작성법‘이라고 생각할 수 있겠다. 코드에서 사용하는 관용어구가 잔뜩 담긴 책과 같다. ‘명시적‘이라는 말의 의미는 이미 위에서 예로 들었듯, 원래는 알아서 잘 되었던 일들을 이제 개발자 개개인이 해내야 한다는 뜻이다. 물론 그걸 여태껏 알아서 잘 해내왔던 데엔 그래픽카드 제조사들의 피땀과 눈물 어린 노력이 있었겠지. 그런데 그 피, 땀, 눈물을 우리한테 이렇게 떠넘겼을 줄이야.


과거엔 잘못된 프로그램을 만들어내거나 하면 PC 운영체제인 Windows(이하 윈도우)가 감당하지 못하고 화면에 파란 화면을 띄우며 죽어버리는, 일명 블루스크린이라는 것이 있었다. 이럴 땐 재부팅이 되어야만 정상화될 수 있었다. 그 원인 중 하나로, 외부 장치와 운영체제를 연결하는 목적으로 동작하는 프로그램인 ‘드라이버’라는 것이 제대로 윈도우와 상호 작용하지 않는 경우가 있다. 하드웨어 하나 잘못 동작시킨 죄로 모든 프로그램이 갈려나가는 것은 운영체제라는 소프트웨어의 입장에서 봤을 땐 매우 불합리한 연좌제와도 같았다.


때문에 이를 보완하기 위하여, 각 장치 제어 방식을 독립적으로 구성하려는 “모듈화”라는 구조 개선을 거쳤고, 마침내 블루스크린은 대부분의 우리로부터 영원히 안녕을 고한 지금 시기에까지 이른다. 아무리 잘못된 드라이버를 구동하여도, 나머지 시스템은 평안을 유지하며 그 드라이버 하나만 셧다운 시키는 것으로 우아하게 해결할 수 있게 된 것이다. 이는 그래픽카드에 대해서도 마찬가지라, 모니터를 통한 화면 출력을 관장하는 엄청난 일을 하는 그래픽카드일지언정, 유저 입장에선 화면이 잠깐 깜빡이는 정도로 문제를 해결하고 시스템이 복구될 수 있다.


그러나 리스크가 줄어든 지금이 태평성대라 할 법했으면 이 글은 쓰이지도 않았을 것이다. 그래픽카드 제조사가 각 프로그램 개발자한테 떠 넘긴 피, 땀, 눈물을 흘릴 시간인 것이다. 특히 요즘의 나는 각 제조사들에게 의심의 눈초리를 보내고 있다. 재부팅을 해야 한다는 하드웨어적인 리스크가 줄어들어 안정성을 높인 만큼 소프트웨어적인 안정성을 떨어뜨려 상계하고자 하는 시도인 걸까 하며 말이다.


그래픽카드 드라이버라는 소프트웨어는 단순히 디바이스라고도 눙쳐서 부르기도 하는데, 잘못된 명령들을 실행하게 되어 영 답이 없다 싶으면 운영체제가 해당 드라이버를 목매달아 죽여버린다. 용어가 정말로 Hung이라는 데서 어처구니가 없다. 또 프로그램을 수행하는데 시간이 너무 길고 영 가망 없어 보인다 싶으면 죽인 뒤에 우리한테는 제거됐다고(Removed) 통보한다.


그간 당해왔던 고통의 세월에 치가 떨리는 만큼 서론이 구구절절 길었는데, 각설하고 문제가 야기되는 경우들을 나열해 보겠다. 일단 개발자 입장에서의 문제는 크게 네 가지로 나뉘고, 별일 없으면 아마 앞으로 이 연작에서 다룰 제목이 될 항목들이다.


1. API 설계 결함 - 거짓된 황금을 작당모의한 잘못들

    1. Khronos: Vulkan이면 세상 모든 걸 다 잘 되게 만들 수 있을 것 같은 희망을 불어넣은 죄

    2. Microsoft: 옆에서 하는 거 보고도 그따위로 DirectX 12를 설계한 죄

2. GPU 프로그래밍 언어 변환기 결함 - 꽃 꽂고 골드러쉬(아님)에 합류한 잘못들

    1. Microsoft: DXC라는 이름의 새 변환기를 만들더니 그래픽카드 제조사들이랑 합도 안 맞추고 개발자한테 떠넘긴 죄와 오픈소스 만들어서 공개하기는 좋아하는데 책임감이 부족한 죄

    2. Sony: 감히 독자적인 언어와 변환기를 만들어두고도 똑같은 코드가 이럴 땐 살고 저럴 땐 죽는데 원인도 안 알려주는 죄

3. 드라이버 결함 - 등 떠밀고 뒷발로 걷어찬 잘못들

    1. AMD: Xbox로 MS에, PS5로 소니에 그래픽카드를 팔아먹곤 자기들은 설계도만 떠넘겼는지 걸핏하면 프로그램이 죽게 만든 죄와 자기들이 직접 만드는 드라이버도 최신 패치에서 더 느려지거나 죽어버리는 죄

    2. Nvidia: 버그 있대서 프로그램 주고 원인 알려줬는데 몇 년째 잠수 타고 해결 안 해주는 죄

4. 장치 결함 - 삽에 들어갈 자재를 삥땅친 잘못들

    1. MS, AMD: ‘Xbox는 왜 아직도 죽을 때마다 재부팅하러 가야 되냐’ 죄 (그것이 콘솔이니까. (끄덕))

    2. Nvidia, Asus: ‘너넨 윈도운데 왜 뻗냐’ 죄 (초기 제품은 이래서 거르란 말이 나오나)


요약해서만 쓰려고 크게 구분했는데도 그 사건들이 하나하나 떠올라서 분노를 가라앉히기 쉽지 않다.


이번엔 서론이니만큼 내용을 깊게 다루지도 않고, 최대한 어려운 용어와 설명들은 피해 썼지만 다음부턴 상황을 이해하도록 설명하는 것부터 몹시 어려울 것 같다는 생각이 든다. 다만, 이쪽은 불모지와도 같아 정보를 공유하기가 쉽지 않은 상태라 나와 비슷한 경험을 가진 사람을 만나는 것부터가 너무 어렵다. 혹 여러분 중에서도 어쩌다 프로그래밍을 하는데, 또 어쩌다 GPU로 고통받는 나날의 연속이라면 그 경험들 공유해 주었으면 좋겠다. 그러기 위해 나부터 글을 쪄본다.

작가의 이전글 일기 3. 뚜벅이의 깨달음
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari