GPGPU

This page was last edited on 13 November 2020, at 05:42.

1 개요

GPGPU는 범용 연산을 위한 그래픽 처리 장치(General-Purpose Graphics Processing Units)의 약자이다.

컴퓨터의 연산은 보통 CPU가 담당한다. 그러나 점점 더 많은 연산량이 필요해지자 다수의 프로세서를 가지고 있으나 개개의 프로세서 성능이 낮은 GPU를 연산 처리 장치로 활용할 방안을 모색하게 된다. 컴퓨터 부품 중 일정한 용도 이외에는 잘 쓰이지 않는 부품 중 하나로 그래픽카드가 있다. 그래픽카드, 그 중에서도 GPU는 게임, 3D 렌더링 등을 제외하고는 거의 사용되지 않기 때문에 쓸모없이 전기를 낭비하는 그래픽카드를 다른 용도로 사용하기 위해 고안된 것이 GPGPU(General-Purposed computing on Graphics Processing Units)이다.


첫 GPGPU 구현은 HLSL을 이용한 GPU 쉐이더 연산이 가능한 Direct3D 9에서 수행되었다. 초창기 GPGPU는 컴퓨트 쉐이더가 아닌 정점 쉐이더와 픽셀 쉐이더만 이용해 구현되었으므로 개발 난이도가 높고 활용도가 낮은 편이었다. Direct3D 9.0c에서 쉐이더 모델 3.0이 사용되며 GPGPU 프로그래밍 활용도가 그나마 높아졌지만 부족한 점이 많았다.

2006년에 NVIDIA에서 GPGPU 언어인 CUDA가 발표되면서 GPGPU 시장이 발전하기 시작했고, 2008년에 AppleOpenCL을 공개하고 Khronos Group에서 표준을 정리하면서 대중적으로 사용되기 시작했다.

그래픽카드는 장치의 특성 상(순차적 연산에 최적화 되어 있는 CPU와는 달리) 단순한 연산을 병렬로 처리하는데 유리하도록 설계되어 있다. 게다가 그래픽 엔진들의 성능이 올라가면서 각종 연산 기능들이 탑재되기 시작했고, 이를 이용하여 '저렴한 슈퍼컴퓨터'를 만들고자 한 것이 그 시작이라 할 수 있다 [관련 기사]. GPGPU를 이용한 프로그래밍은 엔비디아사의 CUDA지원을 시작으로 급 물살을 타기 시작했으며, 이종의 GPU장치 호환이 가능한 언어로서 OpenCL이 나와 있다.

2 원리

GPGPU 기술은 기본적으로 GPU가 ALU를 가지는 하나의 독립적인 프로세서라는 것을 전제하고 시작된다. 다만 CPU의 제어 하에 있는 코프로세서(Co-Processor)이므로 CPU가 GPU에 명령을 내려야 한다. 그리고 이 명령의 형태는 GPU는 DirectX 9 또는 OpenGL 2.0부터 GPU에서 구동할 수 있는 프로그램인 셰이더가 추가됨에 따라 이 셰이더를 이용한다.

초기 GPGPU 기술은 셰이더의 종류 중 픽셀 셰이더를 이용해 구현되었다. 픽셀 셰이더는 그려지는 영역의 크기만큼 병렬적으로 실행되므로 병렬 프로그래밍에 활용되기 좋았기 때문이다. 정점 셰이더는 입출력 정보에 정점 위치 정보가 반드시 필요하여 GPGPU 활용으로는 알맞지 않았다.

그러나 픽셀 셰이더로는 한계가 있기 때문에 DirectX 11부터는 DirectCompute라고 하는 GPGPU 기능이 기본 탑재되었다. 독립적인 GPGPU 언어 및 기술들도 비슷한 시기에 공개 및 활용되었다.

3 관련 기술

3.1 언어 확장

기존 언어의 확장 형태로 존재하는 GPGPU 기술로는 Microsoft C++ AMP가 있다. 이 GPGPU 기술은 C++ AMP 관련 헤더파일을 포함하기만 하면 일반적인 C++ 코드에서 사용할 수 있다. Microsoft C++ AMP는 내부적으로 DirectCompute를 이용하며, GCC 및 LLVM에서도 구현을 검토하고 있을 정도로 사용이 간편하고 가독성이 좋다.

3.2 독립된 컴퓨터 언어

독립된 컴퓨터 언어의 형태로 존재하는 GPGPU 기술로는 NVIDIA CUDA 및 OpenCL이 있다. NVIDIA CUDA는 NVIDIA 그래픽카드에서만 동작하며, OpenCL은 OpenCL 드라이버가 제공되는 모든 그래픽카드에서 동작한다.

NVIDIA CUDA는 NVIDIA에서 직접 언어 표준을 제정하여 사용하고 있고, OpenCL은 Apple이 처음 고안하고 Khronos 그룹에서 API 및 언어 표준을 제정하는 형태로 운영되고 있다.

4 용도

4.1 멀티미디어 처리

GPGPU는 현재 영상 처리에 많이 사용되고 있다. 동영상 인코더 프로그램에서도 GPGPU를 활용하여 더 빠른 속도로 인코딩을 수행하고, 동영상 플레이어에서도 DXVA 등의 그래픽카드 가속 처리를 사용하여 CPU의 부담을 줄인다.

이 외에도 AMD TrueAudio 등의 기술은 오디오의 DSP 처리를 GPU에 맡겨 CPU가 최소 초당 44100~48000 바이트를 처리하는 부담스러운 작업을 최대한 그래픽카드의 많은 코어 수에 떠맡기고 있다.

포토샵 등의 경우 OpenCL을 이용해 무수히 많은 캐시를 만들어 사용해 이미지 처리를 빠르게 수행한다.

오픈소스 오피스 프로그램인 LibreOffice의 경우 OpenCL 2.0의 HSA 기능을 활용해 연산을 빠르게 처리한다.

게임의 경우에는 오픈월드 게임에서는 무수히 많은 게임 오브젝트를 처리하기 위해 GPGPU를 활용하기도 하며, 대부분의 게임은 프레임 영상의 HDR 등의 영상 처리를 위해 사용하기도 한다. 이를 더 고속화하기 위해 DirectX 12, Vulkan 등부터 포함된 비동기 셰이더(Asynchronous Shader) 기능을 활용하기도 한다.

4.2 데이터 분석

빅데이터 처리 등에도 GPGPU가 활용되고 있다. 특히 SETI 프로그램 등의 경우 관련 클라이언트인 BOINC에서 GPGPU 분석 처리 기능을 켜서 GPGPU를 활용할 수 있다.

4.3 인공지능

인공지능에도 GPGPU가 활용되고 있다. 세계에서 가장 유명한 GPGPU 사용 인공지능 프로그램으로는 ALPHAGO가 있다. 이 외에도 이미지의 패턴을 머신러닝을 통해 학습 및 분석하여 크기를 확대하거나 축소하여 다시 그리는 인공지능 프로그램인 Waifu2x도 GPGPU 옵션을 켜서 더 빠르게 연산을 처리할 수 있다.

4.4 그 외

비트코인, 이더리움과 같은 전자화폐의 생성에 GPGPU를 활용하기도 한다. 이 때문에 전자화폐를 기업형으로 취득하는 사람들은 GPGPU에 강한 그래픽카드를 대량으로 구매하여 구동하기도 한다.



5 대표적인 적용 소프트웨어

6 같이 보기

Retrieved from "https://femiwiki.com/index.php?title=GPGPU&oldid=171687"