gpgpu란? GPGPU(General-Purpose computing on Graphics Processing Units, GPU 상의 범용 계산)는 일반적으로 컴퓨터 그래픽스를 위한 계산만 맡았던 그래픽 처리 장치(GPU)를, 전통적으로 중앙 처리 장치(CPU)가 맡았던 응용 프로그램들의 계산에 사용하는 기술입니다. 이를 가능하게 한 것은 프로그램 가능한 층과 고정도 연산을 그래픽 파이프라인에 연결하는 것으로, 이를 통하여 소프트웨어 개발자들이 그래픽이 아닌 데이터에 스트림 프로세싱을 사용할 수 있게 됩니다.
gpgpu를 직역하면 'GPU의 범용 연산'입니다. CPU가 맡았던 연산을 GPU에도 사용해 연산 속도를 향상 시키는 기술입니다. 흔히 '하드웨어 가속'이라고 하면 GPU를 가리키는 경우가 많습니다.
컴퓨팅 셰이더란? 컴퓨팅 셰이더는 일반화된 입력 및 출력 메모리 액세스를 사용하여 거의 모든 유형의 계산을 지원하는 Microsoft HLSL(High Level Shader Language) 프로그래밍 가능한 셰이더입니다. 컴퓨팅 셰이더는 그래픽 프로그래밍을 넘어 Microsoft Direct3D 11을 확장하는 프로그래밍 가능한 셰이더 단계입니다. 컴퓨팅 셰이더 기술을 DirectCompute 기술이라고도 합니다. 다른 프로그래밍 가능한 셰이더(예: 꼭짓점 및 기하 도형 셰이더)와 마찬가지로 컴퓨팅 셰이더는 HLSL 을 사용하여 설계 및 구현되지만 사용되는 목적이 유사하지 않습니다. 컴퓨팅 셰이더는 일반적인 용도의 고속 컴퓨팅(연산)을 제공하고 GPU(그래픽 처리 장치)의 많은 병렬 프로세서를 활용합니다. 컴퓨팅 셰이더는 보다 효과적인 병렬 프로그래밍 방법을 허용하는 메모리 공유 및 스레드 동기화 기능을 제공합니다. ID3D11DeviceContext::D ispatch 또는 ID3D11DeviceContext::D ispatchIndirect 메서드를 호출하여 컴퓨팅 셰이더에서 명령을 실행합니다. 여러 스레드에서 병렬로 컴퓨팅 셰이더를 실행할 수 있습니다.
GPU 컴퓨팅에 가장 중요한 개념은 1. 막강한 컴퓨팅 능력. 2. 느린 메모리 접근 3. CPU-GPU와의 통신 입니다.
1. 막강한 컴퓨팅 능력. GPU는 기본적으로 간단한 프로세서가 수백 수 천개가 들어있습니다. 그렇기 때문에 GPU는 CPU에 비해 계산을 매우 빠르게 할 수 있습니다. 그러나, GPU를 이용한 컴퓨팅은 GPU의 몇가지 특성 때문에 성능이 낮아 질 수 있습니다.
- SIMT 모델 많은 코어를 갖고도 저전력, 소형화를 위해서 GPU는 SIMT(singl instruction multiple threads)모델을 사용합니다. SIMT 모델의 단점은 한번에 하나의 명령(instruction)만 실행 가능 하다는 것으로, if(a>0) b++; else b--; 와 같은 코드에서 덧샘 한번, 다음 뺄셈 한번이 실행됩니다. 따라서 이러한 코드가 있을 때마다 2배의 실행 시간이 소요됩니다. 이런 분기를 줄이고 같은 여러 스레드들(warp)에서는 같은 분기로 실행되게하는 최적화(optimization)가 꼭 필요합니다.
2. 느린 메모리 접근 느린 메모리 접근속도가 GPU컴퓨팅의 성능에 큰 영향을 미칩니다. GPU가 메인 메모리(Dram)에 접근하기 위해선 수백 cycle이 필요합니다. 큰 지연를 숨기기 위해 스레드들(warp)을 context switching 하는 기술을 사용합니다.
Context Switching란? 프로그램의 실행을 위해서는 해당 프로세스의 정보가 메인 메모리에 올라와야 합니다. 때문에 현재 실행중인 A 프로세스의 뒤을 이어서 B 프로세스를 실행시키려면, A 프로세스 관련 데이터를 메인 메모리에서 내리고 B 프로세스관련 데이터를 메인 메모리로 이동시켜야 됩니다. 바로 이것이 Context Switching입니다.
GPU메모리는 계층구조(hierarchy)로 이루어져 있으며, 케시(cache)또한 있습니다.
3. CPU-GPU와의 통신. CPU-GPU같의 데이터 전송은 PCI를 이용해 이루워지는데 이 또한 굉장히 느립니다. 이 데이터 전송량을 최소화하고, memory transfer overlapping(메모리 이동 덥어씌우기) 방법을 사용한 최적화가 필요하다.