GPU 병렬 컴퓨팅을 위한 CUDA!
GPU 즉, Graphics Processing Unit이라는 단어가
등장한지 불과 얼마 지나지 않았지만, 최근 게임 뿐만아니라 GPU의 활용
범위가 넓어지고 있는데 이런 이면에는 CPU보다 높은 처리 성능을 가진
GPU를 범용 목적으로 사용할 수 있게 해주는 CUDA와 같은 기술들이 등장하고
있기 때문이다.
보통 GPU는 지금까지는 단순하게 게임용으로 주로
통용되었으나 DirectX 10/ 10.1 그리고 앞으로 등장할 DirectX 11로의
변화에 따라 GPU도 고정된 처리 유닛을 내장하였던 것에서 유연한 처리가
가능한 즉, 프로그래밍 가능한 유닛을 도입하게 됨에 따라 GPU를 CPU가
처리하던 일정 부분을 처리할 수 있도록 만들어주고 있다.
이렇게 등장한 것이 GPGPU (General Purpose GPU)라는
개념이며, 현재 AMD와 NVIDIA, 그리고 인텔 역시 GPGPU를 위한 GPU를
만들어가고 있다. 이들 중 현재 GPGPU에 가장 적극적인 자세를 보이고
있는 제조사는 NVIDIA로 NVIDIA는 다른 두 제조사들이 CPU와 GPU를 모두
만들고 있는 상황과는 달리 유일하게 GPU 제조사로 남아있기 때문에
앞으로의 그래픽 카드 시장을 예측하기 힘들고 이런 이유로 GPGPU 분야에
더욱 적극적으로 뛰어들고 있다고 볼 수 있다.
AMD와 인텔의 경우 CPU와 GPU를 모두 갖추고 있는
상황이기 때문에 CPU에 GPU를 포함하는 프로세서를 내놓을 경우 당장은
고성능을 갖추지 못하겠지만, 기술 발전으로 CPU에 내장된 GPU의 성능이
크게 증가할 경우 CPU를 갖추지 못한 NVIDIA 입장에서는 실제 판매를
기대할 저가형부터 보급형 시장을 놓치는 것 뿐만 아니라 가격경쟁력
부분에서도 유리하지 못한 입장이 될 것은 분명하다.
고성능 고급형 외장형 그래픽 카드는 더 높은 성능을
원하는 사용자들을 위해 남을 수 있지만, 이도 기술 발전으로 결국에는
그래픽 처리를 위한 GPU는 경쟁사들에 밀려 GPU 개발사의 위치와 자리를
위협받게 되는 위기에 처하게 될 수밖에 없다.
이런 배경이 NVIDIA가 적극적으로 GPGPU 분야에
뛰어들고 있는 것으로 볼 수 있으며, 개발자들에게 익숙한 C언어를 기반으로
한 CUDA를 발표한 것도 이런 맥락으로 볼 수 있을 것이다.
이는 경쟁사들이 바라보는 궁극적인 그래픽 시장과
NVIDIA의 현실, 그리고 일반 사용자들을 위한 컴퓨팅 환경의 한계에
도달하고 있는 부분, 그리고 서버나 기타 활용성이 높은 HPC (High Performance
Computing) 시장이 앞으로 가능성이 높아 NVIDIA 가 지향해 나가야할
방향이기 때문이다. NVIDIA 테슬라 (Tesla) 등의 전문적인 스트리밍
프로세서가 등장하는 이유이기도 여기에 있다.
GPU와 CPU
간의 프로세싱 차이로 GPU를 병렬 컴퓨팅에 활용
CPU가 아닌 GPU를 CPU를 사용하려는 시도를 왜 했을까
궁금할 것인데 이는 바로 GPU 구성이 가진 병렬 처리성 때문으로 이를
적극적으로 활용하면 CPU보다 빠르게 CPU가 할 수 있는 일을 처리할
수 있다.
CPU는 많은 분기 예측과 랜덤 메모리 액세스 등과
같은 범용 컴퓨팅 즉, 시리얼 명령처리에 강점을 가지고 있으며, GPU는
반대로 많은 부동소수점 연산의 병렬 처리연산에 강점을 가지고 있다.
그러나, GPU는 CPU처럼 범용 컴퓨팅보다는 그래픽 처리에 중점을 두도록
만들어지고 있기 때문에 CPU가 강점을 가진 부분의 처리는 약점을 가져
CPU를 대체하기는 어렵다. 그렇지만, GPU의 병렬 처리연산의 강점을
이용하면, CPU가 부족한 부분의 처리 성능을 보완해줄 수 있다.
가장 좋은 처리 방법은 CPU와 GPU가 가진 장점을
동시에 사용하는 것이지만, 이는 현실적으로 쉽지 않으며, 이의 간격을
줄일 수 있는 것이 바로 GPU의 병렬 처리연산의 강점을 사용하여 CPU가
하는 일을 돕는 것이다. 그래픽 카드 제조사들로 보면, NVIDIA는 C언어
기반의 CUDA를, AMD는 ATI Stream (Brook+, OpenCL 활용 등), 인텔은
CPU 코어 기반의 많은 코어를 가진 라라비와 같은 프로그래밍 가능한
GPU를 개발 중이다.
현재 등장한 어플리케이션들은 직렬 (Serial)과
병렬 (Parallel) 방식으로 나누어지는데 직렬 방식을 활용한 어플리케이션은
대표적으로 컴파일러, 워드 프로세서, 웹 브라우저, 이메일 클라이언트
등이 있고 병렬 방식을 활용한 어플리케이션들에는 비디오 플레이, 비디오
인코딩, 이미지 프로세싱, 과학 컴퓨팅, 물리연산, 3D 그래픽 (레이트레이싱
등 포함) 등이 포함된다.
병렬 방식을 활용한 어플리케이션들을 살펴보아도
직렬 명령에 강점을 가진 CPU로 처리하는 것보다 병렬 처리가 강한 GPU를
활용하는 것이 더 효율적으로 사용될 수 있는 부분임을 인지할 수 있으며,
CUDA 등은 병렬 방식 어플리케이션들을 GPU로 가속하기 위한 부분에
중점적을 두고 개발되고 있다.
CUDA는 프로그래밍
가능한 유닛의 등장으로 본격 적용 시작
GPU (Graphics Processing Unit)의 개념은 1998년
8월 NVIDIA에서 처음 발표했는데 초기 GPU들은 처리속도와 메모리 용량,
대역폭도 높지 않았으나 현재는 고속의 메모리를 활용하여 높은 메모리
대역폭 제공, GPU의 처리속도 개선을 통해 GPU 병렬 컴퓨팅에 더욱 적합해졌다.
또, 과거 AGP에서 PCI-Express 1.x (x16 Lane 단방향
4GB/s)를 거쳐 2.0 버전 (x16 Lane 단방향 8GB/s)으로 향상되어 CPU와
GPU 간의 대역폭도 크게 증가되었기 때문에 이들 간의 데이터 처리 능력도
크게 개선되었다.
NVIDIA의 싱글 GPU 최고의 성능을 가진 GeForce
GTX 280의 경우 933GFLOPS (1GFLOPS는 1초에 10억 번의 명령을 처리)의
처리 능력을 가지고 있어 인텔 쿼드 코어인 코어2 익스트림 QX9650의
96GFLOPS의 10배에 가까운 처리 성능을 제공한다.

[GeForce 7
시리즈 다이어그램]


[GeForce GTX
280 다이어그램]
또, 기존 GeForce 7 시리즈는 픽셀과 버텍스 쉐이더
등의 고정된 유닛을 제공함에 따라 정해진 부분의 연상을 제외한 부분의
처리가 어려웠지만, GeForce 8 시리즈 이상부터는 DirectX 10을 지원하면서
픽셀과 버텍스, 지오메트리 쉐이더 처리를 유연하게 처리할 수 있는
즉, 프로그래밍이 가능해져 필요에 따라 다른 작업들도 진행할 수 있다.

GeForce GTX 280에 사용된 쓰레드 프로세서는 이전
GeForce 8/ 9 시리즈의 8개보다 2개 늘어난 10개를 사용하고 있으며,
이에 포함된 스트림프로세서의 수도 16개에서 24개로 크게 증가했다.
쓰레드의 처리 능력 역시 이전보다 3배에 가깝게 증가되었다.
CUDA를 활용할 경우 쓰레드 프로세서 내부에
위치한 코어 사이의 로컬 메모리는 GPU 병렬 처리에서 쓰레드 간의 공유메모리
(Parallel Data Cache, Shared Memory)로 사용하여 코어 간의 데이터를
빠르게 교환할 수 있는 구조를 가진다.
또, CUDA 사용에는 멀티코어 CPU의 병렬처리를 이용하여
오버헤드를 줄일 수 있는 OpenMP를 도입하고 있다. GPU를 사용할 경우
잦은 데이터 전송에 따른 지연이 발생하고 병목현상을 발생시키는데
이를 해결하기 위해 대용량 데이터를 전송하여 잦은 데이터 교환을 줄여야
효율적이다. 그러나, 대용량 데이터 생성시에도 오버헤드가 발생하며,
이를 줄일 수 있는 것인 OpenMP (Open Multi-Processing)다.
CUDA는 GPU
병렬 컴퓨팅이 가능하도록 돕는 소프트웨어 기술

CUDA는 Compute Unified Device Architecture의
약자로 C언어를 기반으로 병렬 처리연산에 최적화된 GPU를 CPU가 사용되는
분야에 적용할 수 있게 해주는 일종의 소프트웨어 기술이며, GPU에 프로그램을
적재하기 위한 드라이버를 의미하기도 한다.
GPGPU가 DirectX나 OpenGL 등과 같은 API 기반을
통해 이루어져 이들에 대한 이해가 필요하며, 랜덤 읽기와 쓰기, 쓰레드
협력처리 부분에 제한이 있으나 CUDA는 C언어를 알고 있으면 그래픽
컨셉에 맞게 알고리즘을 재배열할 필요성이 줄어들어 보다 쉽게 사용할
수 있어 개발자 입장에서도 유리하다. 또, CUDA는 OpenGL 버퍼와 데이터를
공유하므로 OpenGL을 통해 즉시 출력이 가능하고 GPU 메모리 관리를
효율적으로 해준다.
또, 윈도우, 리눅스, 맥 OS 등의 많은 사용자들이
사용하는 운영체제들을 CUDA가 지원하고 있어 운영체제 제한에 따른
문제점들도 크게 줄었다.
최근 등장한 대부분의 CUDA 지원 프로그램은 비디오
인코딩이나 이미지 프로세싱, 물리연산 등과 같이 일반 사용자들이 쉽게
접할 수 잇는 분야가 주를 이루고 전문적인 서버나 HPC (High Performance
Computing)이 필요한 분야에서는 주로 과학연산 컴퓨팅 등과 같은 고성능이
필요한 부분들에 CUDA가 적용된다.
CUDA 응용 분야 중에서는 미국 일리노이 주립대학의
분자 동력학 시뮬레이션 어플리케이션 중 하나인 나노분자동력학 (NAMD)에서의
GPU 가속을 통한 처리 속도 향상, 의학 분야에서는 신경회로 시뮬레이션,
MRI, 바이러스 분자 모델링, EM 등에서 큰 효과를 거두고 있다.
CUDA는 현재 2.0 버전으로 확장되고 있고 256MB
이상의 메모리 용량을 가진 GeForce 8/ 9 시리즈, GTX 200 시리즈 그래픽
카드를 전세계적으로 많은 사용자들이 사용하고 있어 CUDA를 지원하는
프로그램과 이들 그래픽 카드만 있으면 쉽게 CUDA의 장점과 이를 적극
활용할 수 있다.
데스크탑에서 CUDA가 활용되는 분야

[CUDA 지원
프로그램은 꾸준히 증가]
CUDA는 데스크탑 분야에서 CPU가 할 수 있는 일
중 가장 큰 효과를 볼 수 있는 영상 인코딩이나 게임의 물리연산을 중심으로
그 범위를 넓혀나가고 있다. 이는 CPU 인코딩 부분이나 CPU를 이용한
게임의 물리연산 부분에서 GPU 병렬처리를 이용할 수 있게 해주는 CUDA를
사용할 경우 처리 속도 향상과 이전보다 뛰어난 효과들을 일반 사용자들도
쉽게 접할 수 있는 환경이 비교적 잘 갖추어져 있기 때문이다.
CUDA를 게임 물리연산 가속에 활용 - NVIDIA
PhysX
CUDA를 물리연산에 적용하는 사례로 대표적인 것이
AGEIA 물리엔진 개발사의 인수를 통해 만들어진 NVIDIA PhysX를 들 수
있다. 이 역시 그래픽 처리에 이어 게임 내의 물리엔진을 제어해주는
것으로 물리엔진은 사물의 움직임이나 방향성 등을 처리하는데 보통은
CPU를 통해 처리되었으나 CUDA를 이용하는 NVIDIA PhysX는 GPU를 이용한
처리를 가능하게 해주어 더욱 향상된 물리효과와 처리 성능을 개선해준다.
이를 활용한 기술은 이미 지난 기사인 GPU로 가속되는 물리엔진!
NVIDIA PhysX에서 다루었다.
CUDA를 영상 인코딩/ 트랜스코딩 분야에 활용
- BadaBoom 등
CUDA는 또한, 영상 인코딩/ 트랜스코딩 분야에 적극적으로
사용된다. CUDA를 지원하는 트랜스코딩 프로그램으로는 GeForce PowerPack을
통해 제공되는 바다붐 (BadaBoom, 30일 체험판)을 비롯하여 페가시스사의
TMPGEnc 4.0 Xpress 최신 버전, CyberLink의 PowerDirector 7 최신 버전
등을 통해 지원되기 시작하고 있으며, 영상 인코딩 프로그램인 어도비
프리미어 프로 CS4 최신버전과 바다붐을 만든 Elemantal사의 RapiHD
가속기의 CUDA 지원 (Quadro GPU 지원)을 통해 처리성능을 향상시킬
수 있다. 이 외에도 앞으로 등장할 것으로 알려진 일부 인코딩/ 트랜스코딩
프로그램들에서 지원될 것으로 알려지고 있다. 바다붐을 이용한 GPU
트랜스코딩 성능은 지난 기사인 레퍼런스 Leadtek WinFast
GTX 280 1GB로 알아보는 GTX 280 성능편에서 다루었다.
게임 물리연산이나 영상 인코딩 등의 분야 외에도
이미지 프로세싱이나 다양한 분야로 CUDA는 확장되어 사용되고 있다.
CUDA의 가능성
CUDA가 본격적으로 등장한지는 불과 얼마 지나지
않았지만, CPU로 처리하는 분야의 부족한 부분을 GPU를 이용하여 도움으로써
현재의 컴퓨팅 분야에 많은 변화를 가져오고 있다.
데스크탑 분야에서는 게임의 물리연산이나 비디오
인코딩, 이미지 프로세싱에 주력하는 모습을 보이고 있지만, 서버나
고성능 컴퓨팅, 의학/ 과학 분야에 도입되면서 과학연산에 관련된 시뮬리에션과
의학 관련 시뮬리이션, 그리고 기상 예보 등에 사용되는 컴퓨터 등에도
적용되어 CUDA의 가능성을 널리 알리고 있다.
하지만, 아직까지는 CUDA는 걸음마를 시작하는 시작
단계로 볼 수 있어 사용되는 범위도 한정되어 일반 사용자들에게 크게
와닫지는 않으나 게임의 물리연산이나 비디오 인코딩 등을 통해 CUDA의
유용성을 알리고 있고 지원 프로그램도 점차 늘어나고 있다.
NVIDIA는 비주얼 컴퓨팅을 내세우며, Grahpics Plus에
CUDA를 이용하는 PhysX나 3D Stereo, 비디오 프로세싱, 이미지 프로세싱을
강화하고 있어 그만큼 CUDA의 높은 가능성을 보고 데스크탑 환경에 접목해
나가고 있다. 물론, 경쟁사들에서도 이에 대비한 GPGPU 기술들을 소개하고
있으나 적용 시기나 지원 부분에서는 NVIDIA CUDA 만큼 적극적인 모습을
보여주지 못하고 있는 상황이다.
그러나, NVIDIA CUDA 역시 일반 사용자들 입장에서는
체감할 수 있는 부분이 어느 정도 한정되어 있다. 그렇기 때문에 경쟁사들보다
앞선 지원의 장점을 통해 이를 지원할 수 있는 다양한 프로그램의 적극적인
지원이 이루어져야 그래픽 처리 부분과 함께 사용자들에게 어필할 수
있을 것이다. |