본문 바로가기
Tech Insights

CUDA 프로그래밍 - GPGPU? GPU 프로그래밍

by Kudos IT Daily 2024. 2. 23.
반응형

 

 

CUDA 프로그래밍 - GPGPU? GPU 프로그래밍

 

목차

  • CUDA?
  • GPGPU, GPU 프로그래밍
  • CPU와 GPU
  • 마치며

 

안녕하세요, 이번 포스팅을 시작으로 CUDA 프로그래밍에 대한 글을 작성하고자 합니다. 'CUDA 프로그래밍' 포스팅을 통해 CUDA를 활용해서 효과적으로 GPU 프로그래밍을 할 수 있도록 정보를 제공하도록 하겠습니다.

 

 

CUDA?

CUDA(Compute Unified Device Architecture)는 엔비디아(NVIDIA)에서 그래픽 처리 장치(Graphic Processing Unit, GPU)를 활용해 프로그래밍할 수 있도록 제공하는 인터페이스입니다. 최근 GPU는 딥러닝, 빅데이터, 임베디드 등 대용량 데이터를 처리하거나 연산 성능이 중요한 분야에서 뛰어난 성능을 발휘합니다.

 

GPU는 컴퓨터 그래픽스에 특화된 연산 장치입니다. 그래픽스 연산은 컴퓨터 내부 정보를 화면에 나타내는 연산이라고 생각하면 됩니다. 컴퓨터에 저장되는 공간, 이미지 정보는 눈으로 식별하기 어려운 형태의 데이터로 저장됩니다. 따라서, 데이터를 우리가 화면으로 보기 쉬운 형태로 변환하는 과정이 필요합니다. 정보를 화면에 나타낸다는 것은 화면을 구성하는 픽셀(pixel)의 색상 값을 결정하는 것이고, 이 과정은 그래픽스 파이프라인(Graphics pipline)을 통해 이루어집니다.

 

기본적으로 픽셀은 색상을 결정하기 위한 정보가 있으면 독립적으로 처리가 가능합니다. 따라서, 순차적으로 처리하지 않고 병렬적으로 그래픽스 연산을 할 수 있습니다. 컴퓨터의 연산 능력, 디스플레이 장치의 해상도가 발전하면서 그래픽스 파이프라인을 CPU(Central Processing Unit)로 처리하는 것에 한계가 발생했고, 이를 위해 탄생한 것이 GPU입니다.

 

CUDA는 엔비디아 GPU 제품을 활용해 프로그래밍할 수 있도록 하는 인터페이스입니다. CUDA를 활용하면 C/C++, Java, Python 등 여러 언어에서 GPU를 제어하는 프로그램을 작성할 수 있습니다. CPU 중심의 프로그램에 GPU 연산 능력을 추가함으로써 연산 능력의 한계를 극복하고 연산 효율을 끌어올릴 수 있습니다. CUDA는 기본적으로 엔비디아 GPU에서만 사용할 수 있습니다. 따라서, 'CUDA 프로그래밍' 포스팅을 진행하는 과정에서는 엔비디아 GPU를 활용해서 진행합니다.

 

 

GPGPU, GPU 프로그래밍

본격적으로 CUDA 프로그래밍을 시작하기에 앞서, GPU 병렬 프로그래밍의 기본에 대해 설명하고자 합니다. GPU는 앞서 설명드린 것처럼 그래픽을 처리하는 연산 장치입니다. GPU는 그래픽 연산을 병렬 처리하기 위해 수많은 연산 코어를 보유하고 있습니다. 과거의 GPU는 고정된 그래픽스 파이프라인을 통해 그래픽스 연산을 수행했으나, GPU가 발전하면서 그래픽스 파이프라인을 수정할 수 있는 기능이 추가되기 시작했습니다. 기능이 추가되면서 기존 CPU에서만 가능하던 연산을 GPU에서도 수행할 수 있게 되었습니다. 이처럼 CPU가 처리하던 연산을 GPU로 수행하는 것을 General Purpose GPU, GPGPU라고 합니다.

 

2006년 엔비디아가 CUDA를 발표하면서 GPU를 활용하는 분야가 빠르게 발전하고 있습니다. 그렇다면 왜 여러 분야에서 GPU를 도입하는 것일까요? 이유는 GPU의 연산 능력이 CPU에 비해 매우 높기 때문입니다. 연산 성능을 측정할 때, 널리 사용하는 지표로 FLOPS(FLoating point Operations Per Second)가 있습니다. FLOPS는 초당 얼마나 많은 부동소수점 연산을 수행할 수 있는지 나타내는 지표입니다. 아래 그림은 시대가 발전하면서 GPU, CPU 간 FLOPS 연산 성능의 차이를 나타냅니다.

 

 

GPU, CPU의 FLOPS 연산, Memory Bandwidth 차이

 

 

GPU의 FLOPS 성능이 급격하게 상승하면서 CPU와 성능차이가 크게 벌어졌습니다. 여러 분야에서 GPU의 연산 능력을 활용해 연산 속도를 높이기 위한 시도를 하고 있고 대표적인 분야가 딥러닝 분야입니다. 딥러닝 분야 특성상 많은 행렬 연산을 수행해야 하는데, 병렬 처리가 가능한 행렬 연산에 GPU가 널리 활용됩니다. GPU는 비교적 쉬운 연산, 병렬 처리가 가능한 연산에서 매우 높은 처리 능력을 보입니다. GPGPU를 활용하면 시간이 많이 소요되는 연산을 병렬적으로 처리할 수 있어, 연산 성능 및 효율을 향상시킬 수 있습니다.

 

 

CPU와 GPU

GPGPU를 활용한 GPU 프로그래밍은 기존 CPU의 연산 능력의 한계를 극복하고 연산 자원을 효율적으로 활용할 수 있도록 합니다. 하지만, GPU를 활용한 병렬처리가 정답은 아닙니다. CPU와 GPU는 서로 다른 특성과 장단점을 가지고 있습니다. 따라서, 두 연산 장치의 특성을 이해하고 적합한 연산 장치를 선택 및 조합하는 것이 중요합니다.

 

CPU는 범용 연산 장치입니다. 컴퓨터의 연산 기능을 담당하고, 다양한 형태의 연산에 일반적으로 작동하도록 발전했습니다. CPU의 연산 능력을 높이기 위한 가장 기본적인 접근법은 연산 코어의 성능을 높이는 것입니다. 즉, 코어의 클럭 주파수(Clock frequency)를 높이는 방법으로 연산 코어의 성능을 올려왔습니다.

 

일반적인 프로그램은 많은 분기를 가지고 있고, 메모리 접근이 불규칙한 경우가 많습니다. CPU는 불규칙한 동작에 따른 성능 저하를 줄이기 위해 분기 예측(Branch prediction) 기법과 불규칙한 메모리 접근에 의한 병목현상을 해소할 수 있는 캐시 효율 향상에 많은 투자를 해왔습니다. CPU는 이러한 기능 향상을 위해 제어 유닛(Control) 및 캐시(DRAM, Cache)에 많은 공간을 할당합니다. 따라서, CPU 단일 코어의 성능은 GPU에 비해 월등이 높고, 불규칙한 흐름을 가지는 연산에 대해 높은 성능을 보입니다. 하지만, 코어의 크기, 제어 장치, 캐시 공간 할당의 이유로 많은 수의 연산 코어를 넣기 힘들다는 단점이 있습니다.

 

 

멀티코어 CPU, GPU 아키텍처 비교

 

 

GPU는 앞서 설명드린 것처럼 그래픽스 파이프라인 연산 가속을 위해 개발되었습니다. 따라서, 가시화 파이프라인 연산을 동시에 처리하기 위해 GPU 내 코어 수를 늘리는 데 집중했습니다. 위 그림처럼 주어진 공간에 많은 수의 코어를 넣기 위해 개별 코어의 성능을 높이기보다 꼭 필요한 제어 기능만 넣어 크기를 줄이는 방향으로 발전했습니다. 그 결과, 하나의 GPU에 수백에서 수천 개의 코어를 집적하게 됐습니다.

 

그래픽스 파이프라인 연산 흐름이 규칙적인 만큼 메모리에 대한 접근 형태도 대체로 규칙적입니다. 따라서, GPU는 캐시에 상대적으로 작은 공간을 할당합니다. 반면, 많은 수의 코어에 데이터를 동시에 공급해야 하기 때문에 한 번에 많은 데이터에 접근해야 합니다. 즉, 높은 대역폭을 갖는 고성능 메모리가 필요하고, GPU는 DDR6, 고대역 메모리(High Bandwidth Memory, HBM)와 같은 고성능 메모리를 사용합니다. 하지만, 고성능 메모리는 가격이 비싸기 때문에 코기는 1~48GB 정도로 CPU에 비해 상대적으로 작습니다.

 

GPU는 CPU에 비해 FLOPS 관점에서 매우 높은 처리 성능을 보입니다. 단, 연산 및 메모리 접근이 규칙적일 때, 높은 성능을 보입니다. 스레드 사이에 불규칙한 연산 흐름을 보이거나 임의적인 메모리 접근 형태를 나타내면 연산 효율이 감소합니다. 아래의 그림은 CPU와 GPU의 구조 및 장단점을 나타냅니다.

 

CPU, GPU의 구조 및 장단점 비교

 

 

마치며

오늘 포스팅에서는 'CUDA 프로그래밍' 포스팅을 시작하면서 CUDA, GPU, GPGPU 등 기본적인 개념에 대해 소개했습니다. 이어지는 포스팅에서는 '병렬 처리 프로그래밍'의 개념에 대해 다루면서 CUDA 프로그래밍에 필요한 개념을 알아보도록 하겠습니다.

 

오늘 포스팅이 도움이 되셨기를 바라면서 글 마치도록 하겠습니다. 고맙습니다.

 

 

Reference

1. CUDA 기반 GPU 병렬 처리 프로그래밍 - 기초부터 성능 최적화 전략까지

2. CUDA C++ Programming Guide

반응형