5.2 ’해킹’에서 시작된 혁신: 개척자들의 고군분투
GPU(Graphics Processing Unit)라는 이 거친 잠재력의 야수를 일반적인 학문 계산용으로 길들이기 위해 가장 먼저 곡괭이를 들고 뛰어든 선구자들은, 엔비디아(NVIDIA) 본사의 훌륭한 엔지니어들이 아니었다. 그들은 다름 아닌 컴퓨터 학계와 연구실(Lab) 곳곳에 숨어있던 집요한 광신도이자 괴짜 해커(Hacker)들이었다.
이 5.2장에서는 그래픽 처리용으로만 꽁꽁 밀봉되어 있던 GPU의 닫힌 파이프라인(Pipeline)을 강제로 뚫어내기 위한 이 초기 개척자들의 눈물겨우면서도 코믹한 고군분투(Struggle) 서사를 추적한다. 그들은 점잖은 과학 공식들을 비디오 게임의 화려한 색상 픽셀(Pixel) 데이터인 양 감쪽같이 속여서 GPU에 욱여넣는 이른바 ’속임수(Hack) 연산’을 통해 역사상 최초로 픽셀 너머의 답을 추출해 내는 데 성공하고 열광했다.
나아가, 이렇게 원시적으로 해킹하듯 이루어지던 그래픽 칩 연산 작업에 어느 정도 체계적인 질서를 부여하고자 했던 스탠퍼드 대학교(Stanford University) 연구팀의 시도를 들여다본다. 그중에서도 훗날 엔비디아와 GPU 역사의 궤적을 송두리째 바꿔놓게 될 가장 결정적인 천재 대학원생 이안 벅(Ian Buck) 의 등장과, 그가 만들어낸 세계 최초의 GPGPU 전용 컴파일러 언어, ‘브룩(Brook)’ 프로젝트의 위대한 첫걸음을 밀착해서 기록한다.
5.2.1 그래픽 API(OpenGL, DirectX)를 활용한 꼼수(Hack) 연산의 시대
2000년대 초, GPU(Graphics Processing Unit)의 폭력적인 병렬 연산(Parallel Computing) 힘을 과학 계산에 빼앗아 쓰고 싶었던 선구적인 연구자들이 마주한 첫 번째 벽은 그야말로 절망적이었다. GPU에는 일반적인 C언어나 포트란(Fortran) 코드 같은 인간의 수학적 논리를 그대로 친절하게 집어넣을 수 있는 통로가 아예 원천적으로 존재하지 않았다. 칩과 대화할 수 있는 유일한 통역기는 마이크로소프트의 다이렉트X(DirectX)나 SGI의 OpenGL과 같은 ’순혈 그래픽 출력 전용 API’뿐이었다.
이 완고하고 권위적인 그래픽 API들에게 일반적인 소수점 행렬(Matrix) 곱셈 공식을 던져주면, 그들은 완벽하게 침묵하거나 에러(Error)를 뿜어냈다. 이에 미쳐버린 학계의 괴짜 해커(Hacker)들은 눈물겨운 꼼수, 즉 일종의 ‘속임수 기만술(Hacking System)’ 을 고안해 냈다.
“만약 저 멍청한 그래픽 언어가 ’빛과 원근법’에 관련된 명령어만 억지로 해석하려 든다면, 우리의 복잡한 기초 과학 수학 공식들을 아예 3D 그래픽 삼각형 폴리곤(Polygon)을 렌더링(Rendering)하는 공식인 것처럼 교묘하게 위장해서 집어넣자!”
그들은 멀쩡한 지진파나 유체 역학 수치 데이터를 비디오 게임 화면 어딘가에 투영되는 X, Y, Z 좌표의 텍스처(Texture) 매핑용 좌표값으로 강제 치환하는 모욕적이고 기괴한 코딩(Coding) 역도를 감행했다. 연구실의 대학원생들은 자신의 고매한 물리학 공식을 GPU에 돌리기 위해 밤마다 컴퓨터 그래픽스(Computer Graphics) 교과서를 뒤적이며 빛의 굴절이나 폴리곤 투시 렌더링 같은 엉뚱한 미술적(?) 공학을 피를 토하며 공부해야만 하는 웃지 못할 촌극의 꼼수(Hack) 연산 시대가 그렇게 사생아처럼 열렸다.
5.2.2 복잡한 수학 연산을 픽셀 색상 데이터로 속여 계산하던 연구자들
그래픽 파이프라인(Graphic Pipeline) 틈새로 억지로 데이터를 구겨 넣은 연구자들을 기다리고 있던 대환장의 다음 관문은, 바로 수만 개의 연산을 미친 듯이 마친 GPU에서 마침내 그 결과물(Result) 값을 어떻게 빼낼 것인가 하는 참담한 과제였다. 당시 GPU는 연산을 마치면 오직 모니터 화면 위로 쏴주기 위한 빨강(Red), 초록(Green), 파랑(Blue), 즉 RGB 색상 픽셀(Pixel Color) 형태의 시각 정보로만 결괏값을 게워내는 일방통행 배관 구조였다.
연구자들은 기가 막힌 임기응변(Improvisation)을 발휘했다. 그들은 자신들이 던졌던 복잡한 기초 수학 배열 연산의 최종 결괏값들(예컨대 금융 파생 이자율이나, 기상 시뮬레이션 온도 수치 등)을 화면 상의 ’픽셀 색상의 명암과 농도 수치’로 강제로 찍어내게끔 GPU를 속여 치는 코드를 작성했다.
graph TD
A[과학 연구자의 복잡한 수학 계산 명령<br>Complex Scientific Math] --> B{데이터 위장 및 꼼수 입력<br>Hacking & Data Disguise}
B --> C[명령을 3D 게임 그래픽 위치 값으로 조작<br>Fake as Texture Mapping]
C --> D[엔비디아 GPU의 병렬 회로<br>Hard-wired ALU]
D --> |빛과 색깔 계산인 줄 알고 미친속도로 연산| E[렌더링 결과물 도출<br>Rendering Output]
E --> F[결괏값을 RGB 화면 픽셀 색상으로 방출<br>Output as Color Pixel]
F --> G{결괏값 꼼수 추출<br>Reverse Hacking}
G --> H[픽셀의 색 농도 값을 다시 수학 숫자로 역환산<br>Convert Color back to Math]
style H fill:#f9f,stroke:#333,stroke-width:2px,color:#fff
연산이 끝난 후, 그들은 컴퓨터 플로피 디스크 저장이 아닌 ’화면 프레임 캡처(Screen Capture)용 버퍼 데이터’를 강제로 긁어모아 왔다. 그리고 특정 좌표에서 뿜어진 새빨간 픽셀의 농도 값을 다시 소수점 형태의 기초 수학 숫자로 역변환(Reverse Convert)해내는 지독하게 변태적인 과정 수백만 번을 직접 코딩했다. 겉보기에는 모니터에 이상하고 어지러운 무지갯빛 노이즈 화면이 무의미하게 깜빡거리는 것처럼 보였지만, 실상은 그 화면의 색상 입자 하나하나가 기존 CPU라면 며칠이 걸렸을 초고난도 행렬 미분 방정식이 극단적인 병렬 속도로 처방되어 게워져 나온 경이로운 천재 수학 논문(Math Paper)의 결괏값 자체였던 것이다.
5.2.3 스탠퍼드 대학교 이안 벅(Ian Buck)과 최초의 GPGPU 언어 ‘브룩(Brook)’ 프로젝트
GPU를 계산기로 쓰기 위해 픽셀 색상을 모니터에서 긁어오며 해킹(Hacking)에 가까운 코딩 노가다를 하던 학계의 절망적인 변태적 코딩(Coding) 짓거리는, 당시 스탠퍼드 대학교(Stanford University) 그래픽 연구소의 천재 대학원생이었던 이안 벅(Ian Buck) 의 등장으로 마침내 체계적인 공학적 해방(Liberation)의 실마리를 찾게 된다.
오직 그래픽 지식이 있는 극소수의 괴짜들만이 변칙적인 API로 도둑질하듯 GPU 병렬 연산을 만지는 현실에 깊은 환멸을 느낀 이안 벅은, “왜 이 엄청난 괴물 가속 칩셋을 다루는 데 C언어 같은 대중적이고 아름다운 범용 프로그래밍 언어를 그대로 사용할 수는 없는가?“라는 가장 본질적이고도 위험한 질문을 던졌다.
그는 스탠퍼드 랩(Lab)실에 틀어박혀, 그래픽 관련 코드나 다이렉트X(DirectX)의 조악한 렌더링 명령어 따위를 단 한 줄도 알 필요 없이 일반적이고 친숙한 C언어 문법만으로도 코드를 짜서 집어넣으면, 시스템이 알아서 그 수학 코드를 그래픽 픽셀(Pixel) 데이터 구조로 교묘하게 변환해 엔비디아(NVIDIA) 칩에 먹여주는 환상적인 컴파일러(Compiler) 브릿지(Bridge)를 구축하기 시작했다.
그것이 바로 역사상 최초로 완전한 범용 컴퓨팅(General-Purpose computing)을 목적으로 탄생한 선구자적인 GPU 전용 오픈소스 프로그래밍 모델, ‘브룩(Brook)’ 프로젝트였다. 이안 벅의 브룩 덕분에 수많은 의학자와 통계학자들은 끔찍한 그래픽 렌더링을 억지로 배우는 고통에서 해방되어, GPU 거대 병렬 코어의 문을 두드릴 첫 번째 대중적인 열쇠(Master Key)를 손에 쥐게 되었다. 비록 그것은 아직 초기 학술 차원의 조잡한 실험에 불과했지만, 훗날 엔비디아의 CUDA(쿠다) 제국이라는 거대한 쓰나미(Tsunami)를 촉발하게 된 가장 명확하고 위대한 발화점(Ignition Point)이었다.