본문 바로가기
IT/Teckweek

GPGPU (General Purpose GPU)

by YEON-DU 2022. 12. 13.
반응형

GPGPU란?

 

General-Purpose computing on Graphics Processing Units의 머릿글자로, 직역하면 'GPU의 범용 연산'. CPU가 맡았던 연산을 GPU에도 사용해 연산 속도를 향상 시키는 기술이다. 흔히 '하드웨어 가속'이라고 하면 GPU를 가리키는 경우가 많다.

 

CPU에는 대부분의 앱 처리를 수행하는 몇 개의 강력한 코어가 있지만 GPU에는 복잡한 병렬 계산을 수행할 수 있는 수백 또는 수천 개의 빠르고 효율적인 코어가 있다.

즉, CPU는 여러 스레드에서 하나의 작업을 정말 잘 수행하고 GPU는 동시에 작은 작업을 모두 수행할 수 있다는 것을 말한다. (둘의 차이점은 위의 영상에서 잘 볼 수 있다.)

그래픽카드가 GPU가 된 이유

초기의 그래픽 API들과 그것을 지원하는 그래픽카드 하드웨어의 기능은 3차원 공간에서 점을 찍고, 점을 이어서 선을 그려주는 것 뿐이었다.

그러나 선을 이어 삼각형 이상의 면을 만들게 되고 나자 이것에 색을 채워줄 필요성이 생겼다.

처음에야 그냥 앞을 보면 밝은색으로 바르고, 옆을 보면 좀 어둡게 발라주고, 아래를 보면 컴컴한 색으로 발라주는 등 단순한 구조로 업데이트 되었으나, 점차 하드웨어가 발달하고 게이머들의 눈높이가 올라가면서 텍스처를 발라준다거나, 각도에 따라 조명의 비율에 따라 색의 계조를 넣어주는 등 점점 계산해야 할 거리가 늘어나기 시작했다.

이것은 결국 픽셀 하나하나마다 그 위치의 텍스처 색상, 그 위치에 비치는 빛, 사용자 시점과의 각도 등을 계산하여 정확한 RGB 컬러를 계산해야 하는 단계까지 도달했다. (픽셀 셰이더의 시작)

그래픽카드는 화면에 있는 모든 픽셀에 대한 거의 동일한 계산작업을 매 프레임마다 해야하는 상황이 되었고, 이러한 처리를 하기 위해서는 무식하게 처리속도만을 올려 작업을 반복하는 것보다 해당 처리회로의 갯수를 늘려 한꺼번에 여러 픽셀씩 해치우는 것이 보다 효과적인 상황이 되었다. 그래서 이 시기부터 그래픽카드는 병렬처리 능력을 높여갔고, 보다 더 많은 병렬처리 능력으로 한번에 많은 양의 픽셀을 처리하는 것을 내세우게 되었다.

텍스처 입력 → 내가 커스텀한 그림자/셰이더/기타연산 코드 연산 → 결과 텍스처 도출

입력값→함수→결과값 이랑 동일한거 아닌가? 100x100픽셀 이미지를 쓰면 1만개 연산이 한큐에 나오겠네?

 

ALU가 연산을 담당한다.

GPU에게 연산을 시키려면 몇 가지 하드웨어 요구 사항을 충족해야 한다.

 

먼저 프로그램 가능한 셰이더가 있어야 한다. 이렇게 프로그램 가능한 셰이더는 그래픽 카드가 기본 지원하지 않는 셰이더도 그릴 수 있어 더 많은 표현(렌즈 효과, 변위 매핑, 필드 깊이 등)을 할 수 있다. 이 부분을 이용하여 연산을 하게 된다. 또한, 데이터 자료형의 추가도 필요하다. 일반 그래픽 응용프로그램처럼 모든 계산이 행렬식으로 처리되지는 않기 때문이다.

CPU는 처음부터 연산식과 데이터가 지멋대로 튀는 환경을 가정해서 설계했지만 GPU에게 이런 조건을 던져주면 제어부가 CPU에 비해 빈약해서 정작 일을 해야 할 ALU 부분이 놀고 있다. 대표적으로 GPU에서 돌아갈 코드에 if 문을 하나 사용할 때마다 가용 자원을 절반씩 깎아 먹는다고 봐도 된다.

 

if 문은 코드의 흐름을 두 개로 갈라 놓는 역할을 하기 때문에 이런 건 CPU 쪽에서 가능한 한 처리해주는 게 좋다.

그렇지 않으면 if 문의 반대편 절반에 해당하는 데이터는 처리되지 못하고 대기하다가 앞쪽 절반에 해당하는 데이터가 다 처리된 뒤에야 비로소 계산을 재개한다. 물론 if 문의 한쪽에 데이터의 99%가 몰려 있다거나 데이터 양 자체가 충분히 많아서 절반쯤 나뉘어도 GPU의 자원을 전부 사용하는 경우에는 써도 성능에 큰 지장은 없다.

 

CPU 쪽에서 GPU 쪽으로 연산할 데이터를 제대로 던져주는 것도 만만한 작업이 아니다. 위에서는 간단한 분기문만을 예시로 들었지만, 데이터 자체를 전달하는 것도 고려할 사항이 많다. GPU에 작은 데이터를 일일이 다 나누어서 던져 주면 GPU에서 아무리 빠르게 처리해 줘도 GPU로 데이터를 보내고 받는 동안 시간을 까먹기 때문에 CPU보다 더 느려지는 경우도 있다.

 

CPU 프로그래밍

데이터를 가져옴 → 로직에 넣음 → 결과를 사용함

 

GPU 연산 프로그래밍

데이터를 가져옴 →  GPU에 전송할 데이터를 준비→GPU로 데이터 전송→결과를 기다림→ GPU에서 결과 데이터를 수신 → 수신한 데이터에서 사용할 결과를 추출

CPU 입장에서 보면 전송 및 수신 단계만 해도 상당한 시간이 소요된다. 이 부분을 고려하여 GPGPU를 사용할 지를 생각해서 적절한 부분에 적용해야한다.

반응형

'IT > Teckweek' 카테고리의 다른 글

Forward Rendering vs Deferred Rendering  (0) 2022.12.29
Rendering Pipeline  (0) 2022.11.12
BlendMode  (0) 2022.11.05
SCM (Software Configuration Management)  (0) 2022.10.26
CI/CD  (0) 2022.10.06

댓글