GPGPU

From CS Wiki

General-Purpose computing on Graphics Processing Units

GPGPU란 그래픽 카드를 위해 만들어졌던 GPU란 개념을 일반 연산에 적용시켜 CPU처럼 활용하는 개념을 말한다.

GPGPU 개념의 등장 배경[edit | edit source]

초기 컴퓨터는 CPU가 화면에 출력할 정보를 계산하는 것은 물론 디스플레이에 보낼 전기 신호까지도 직접 생성했으며, 이 때문에 화면 출력을 하는 것 자체가 CPU의 연산을 소모하는 행동이었다. 이 때는 아예 CPU가 연동된 시스템 클럭이 디스플레이와의 통신 프로토콜과 연동되어 있을 정도로 얽혀 있었다.

이후 1980년대에 16비트 컴퓨터의 시대가 오면서 화면 출력의 역할은 메인보드 안에 있는 디스플레이 전용 회로를 거쳐 별도로 판매되는 그래픽 카드가 전담하게 되었지만, 이때까지도 그래픽 카드의 역할은 메모리에 표현된 이미지를 화면으로 옮기는 역할에 지나지 않았다. 이 시대의 모든 디스플레이는 순수하게 글자만 표시하는 문자 모드 아니면 2D 화면을 표시하는 그래픽 모드, 두 가지였기 때문에, 화면에 표시되는 정보가 담긴 RAM의 주소가 하드웨어에 예약 되어있었고, 그래픽 카드는 직접 RAM의 해당 구간을 읽어 디스플레이하는 역할을 담당했다.

그래픽 카드의 역할이 본격적으로 커지기 시작한 것은 슈퍼 VGA(SVGA)의 등장과 3D 그래픽의 부상과 맞물려 있다. VGA 그래픽 시절까지는 화면 전체를 표시하기 위한 메모리 용량이 기본적으로 시스템의 하드웨어 기본 메모리인 1MB의 일부를 예약해서 쓰는 것만으로 충분했지만, 해상도와 색상 가짓수가 늘어나면서 화면을 담기 위한 메모리 공간이 기하급수적으로 늘어나기 시작했다. 그래픽 카드 제조사들은 자신들이 제조하는 카드 안에 보조 메모리를 집어넣고 그 사용법을 프로그래머들에게 배포하기 시작했다. 이때부터 내부 메모리를 제어하는 등 그래픽 카드 안에 점점 복잡한 처리 회로가 추가되기 시작했다.

흔히 잘 알려지지 않은 당시 SVGA들의 특화기능으로, '2D 가속기능' 이 있다. 이것은 GUI 프로그램들이 점점 많아지고 윈도우 그래픽 환경에서 구동되는 사무, 전문 프로그램들이 늘어나자 2D 윈도우의 화면 처리 속도를 높이기 위한 기능이었다. 실제로 그 이전까지 비디오 게임이 아닌 사무에서 2D 그래픽의 속도는 중요하게 취급되지 않았지만, 윈도우에서는 사용자의 입력이나 데이터 처리 표시 등이 모두 그래픽으로 즉각 반응해야 했기 때문에 화면의 속도도 중요하게 취급되었다. 486부터 펜티엄까지 시절의 그래픽 카드에선 화면 출력 속도가 빠르다는 사실이 꽤 중요하게 사용된 마케팅 포인트였다.

이어 개인용 컴퓨터에서 3D 그래픽이 사용된 게임을 하게 되면서 그래픽 카드에 대한 요구가 더 증가했다. 컴퓨터는 특정 게임 하나만을 위해 제작된 기기가 아닌 만큼 3D 그래픽을 처리하기 위해서는 프로그램별로 3D 처리 기능을 내장시켜 줘야 했다. 초기의 프로그램들은 수학적으로 3차원 공간의 좌표를 직접 계산해서 처리했지만 이것은 수행하기 어려울 뿐만 아니라 성능이 낮다는 치명적인 단점이 있었다. 따라서 당시에도 이미 2D 가속 기능, SVGA 고해상도 처리 기능 등 사용자 니즈에 맞춰 제품과 그 사용 솔루션을 함께 개발해서 팔아오던 각 그래픽 카드 제조사들은 게임 개발자들을 위해 당시 많이 사용되던 3D 계산 기능들을 정리해 하드웨어에 내장시키고, 그것을 사용하기 위한 라이브러리를 프로그래머들에게 제공하기 시작했다. 이 때 등장한 것이 GLIDE와 같은 하드웨어 가속 API였으며, OpenGL, 윈도우 DirectX 등이 등장했다.

초기의 그래픽 API들과 그것을 지원하는 그래픽 카드 하드웨어의 기능들은 기껏해야 3차원 공간에서 점을 찍고, 점을 이어서 선을 그려주는 것에서 출발했다. 그러나 일단 선을 이어 삼각형 이상의 면을 만들게 되고 나자 이것에 색을 채워줄 필요성이 생겼다. 처음에는 각도에 따른 명암만 달리하는 정도였지만, 점차 하드웨어가 발달하고 고객들의 눈높이가 올라가면서 텍스처를 입히거나, 각도에 따라 조명의 비율에 따라 색의 계조를 넣어주는 등 점점 고도화된 계산이 적용되었다.

이것은 결국 픽셀 하나하나마다 그 위치의 텍스처 색상, 그 위치에 비치는 빛, 사용자 시점과의 각도 등을 계산하여 정확한 RGB 컬러를 계산해야 하는 단계까지 도달했고, 이것이 픽셀 셰이더의 시작이다. 이렇게 되자 그래픽 카드는 화면에 있는 모든 픽셀에 대한 거의 동일한 계산작업을 매 프레임마다 해야하는 상황이 되었고, 이러한 처리를 하기 위해서는 무식하게 처리속도만을 올려 작업을 반복하는 것보다 해당 처리회로의 갯수를 늘려 한꺼번에 여러 픽셀씩 해치우는 것이 보다 효과적인 상황이 되었다. 그래서 이 시기부터 그래픽 카드는 병렬처리 능력을 높여갔다.

2006년 엔비디아에서 G80 아키텍처를 내놓으면서 시대의 흐름이 바뀌었다. 그 이전까지의 GPU 컴퓨팅이라는 것이 어디까지나 주 기능에 덧붙여진 보조적인 기능이었지만, 엔비디아 CEO 젠슨 황은 아예 미래의 그래픽 카드는 '연산 전용 장치'로서 역할이 바뀔 것이라는 비전을 제시하고 아예 병렬 처리 기능을 중심에 놓고 그것을 확장해서 그래픽 연산기능을 제공하는 아키텍처를 출시했다. 이렇게 병렬 처리 전용으로 처음 제공된 API가 CUDA이며, 이 때부터 프로그래머들과 교류하면서 성능 및 편의성을 개선한 덕분에 아직까지 GPGPU API의 최강자 지위를 차지하고 있다. 후발주자들은 컨소시엄을 만들어 OpenCL 등으로 범용성을 추구하는 등으로 우회한 장점을 추구했지만 파편화로 인한 최적화 성능의 부족 및 개발자 친화성 부족 등이 발목을 잡아 밀리고 있는 실정이다.

CPU와 GPU의 차이[edit | edit source]

구분 중앙 처리 장치(CPU) 그래픽 처리 장치(GPU)
함수 서버의 주요 처리 연산을 해결하는 일반화된 구성 요소 병렬 컴퓨팅에 탁월한 전문화된 구성 요소
처리 중 직렬 명령 처리를 위해 설계됨 병렬 명령 처리를 위해 설계됨
설계 코어 수는 더 적지만 코어 성능은 더 강력함 CPU보다 코어 수는 더 많지만 CPU 코어보다 성능이 떨어짐
가장 적합한 용도 범용 컴퓨팅 애플리케이션 고성능 컴퓨팅 애플리케이션
비유
  • 스포츠카
  • 몇명의 엘리트
  • 대형 트럭
  • 수 천명의 노동자

CPU와 GPU의 구 CPU는 다양한 환경에서의 작업을 빠르게 수행하기 위해 복잡한 ALU(산술 논리 유닛)와 FPU(부동 소수점 유닛) 구조를 가지고 있고, 명령어 하나로 처리할 수 있는 기능(SIMD)도 많으며, 각종 제어 처리를 위한 부분이 매우 많다. CPU에 계속 추가되고 있는 확장 명령어 셋들을(SSE, AVX, FMA 등) 보면 명령어 하나로 계산 여러 개를 한꺼번에 하거나 복잡한 수식 처리를 하기 위한 것이 많다.

GPU는 특화된 연산을 빠른 속도로 수행하기 위해 그런 부분을 과감히 삭제하고 비교적 단순한 다수(수백 개)의 ALU와 FPU에 집중하는 구조로 만들어졌다. 때문에 GPU 단독으로는 어떤 고차원적인 작업은 처리할 수 없다. GPU라는 계산기를 두드리며 제어하고 명령하는 것은 여전히 CPU이다.

GPU는 대량 계산에 용이하게 설계되므로 잘 이용하면 연산 성능을 향상시킬 수 있다. 대표적인 예가 GPU의 탄생 배경인 그래픽 처리이고, 최근 4차산업혁명 시대에 들어선 인공지능과 블록체인을 위한 연산 등에서 CPU보다 훨씬 빠른 성능을 보여주고 있다. 이렇게 그래픽 처리가 아닌 다른 목적들로 범용성을 가지고 GPU가 사용되는 것을 GPGPU라고 한다.