CUDA (쿠다) 란, 왜 사용하는 것인가.
CUDA (Computed Unified Device Architecture) 는 NVIDIA 사에서 개발한 GPU (Graphic Processing Unit)개발 툴이다. (설치방법 링크)
CUDA C 라는 언어를 사용하고 C++/C 등에 넣어 사용할 수 있다.
(이 블로그에서는 C++에 넣어 사용할 예정이다. IDE (Integrated Development Environment) 는 비쥬얼 스튜디오를 사용한다.)
CUDA의 역사와 원론적인 이야기는 NVIDIA 홈페이지나 여타 다른 블로그에 소개되어 있기 때문에 간단하게 설명하겠다.
2006년 NVIDIA는 Fermi Architecture 를 발표하며 CUDA 를 세상에 내놓았다. 이전까지는 전문가들이 아니면 GPU 를 이용한 프로그래밍이 어려웠는데 CUDA 의 등장 이후 많은 프로그래머들이 GPU 를 이용한 프로그래밍이 가능하게 되었다.
CUDA를 사용하는 이유는 매우 간단하다. 많은 양의 연산을 동시에 처리하자.
기존의 컴퓨터 연산은 CPU (Central Processing Unit)을 사용했다. (RAM (Random Access Memory)에 있는 데이터를 연산한다.)
CPU 를 이용한 연산은 대부분 Single-Core(사람의 뇌 라 생각하면 됨)를 사용하고 OpenMP (MultiProcessing) 등을 이용하여 Multi-Core 를 이용한 연산을 할 수 있다.
이에 반해 GPU 를 이용한 연산 Many-Core 를 이용하고 VRAM (Video RAM) 에 있는 데이터를 연산한다.
Core 당 속도는 당연히 CPU 가 GPU 보다 더 빠르다.
CPU 는 대부분 코어 당 속도가 3.0 GHz 정도이고 GPU는 16년 하반기에 등장한 Pascal Architecture 의 경우에는 1.8 GHz 로 많이 증가했으나 이전 Maxwell 2th Architecture 에는 0.9GHz 정도였다.
하지만 코어 숫자는 CPU 의 경우 가정에서 쓰이는 것 기준 대부분 4 코어, GPU는 1500 코어 이상이다.
실제로 사용할 때 재귀연산 (recursive, 자기 자신을 재 참조하는 연산) 을 사용하는 함수는 '직렬' 연산을 해야한다.
하지만 그 경우가 아니라면 병렬 연산을 해주는 것이 훨씬 효과적이다.
<그림 1> 행렬 연산의 예
위 연산을 예시로 살펴보자.
먼저 직렬 연산이 더 빠른 재귀연산 (recursive) 의 경우에 대해 살펴보자.
이 연산을 할 때 1행1열에 더해질 숫자를 입력한 후 행/열 순으로 증가하며 이전에 더했던 숫자와 같은 수를 각 행에 더한다고 할 때 1행1열의 덧셈 이후 2행1열의 덧셈을 진행할 때 이전에 더해진 값을 알아야 하기 때문에 연산이 순차적으로 진행된다. 그렇기 때문에 이 글에서 소개하고자 하는 CUDA 의 '병렬'연산에는 적합하지 않고 단일 코어의 속도가 높은 CPU 를 이용한 연산이 더 유리하다.
(글이 길어져 이해가 안될수도 있고 설명이 부실하기 때문에 넘어가도 무관하다.)
4x4 행렬 모든 성분에 1씩 더해주는 연산을 한다. 직렬 연산의 경우 이 연산을 16번에 걸쳐 하지만 병렬 연산의 경우 16번의 연산을 한 번에 걸쳐 한다.
앞서 말한 CPU / GPU 의 코어 수, 속도로 살펴보자. 코어 당 속도가 CPU가 GPU의 2배일 때 CPU로 연산을 하면 8 의 시간이 걸리던 것이 GPU를 이용하면 1의 시간이 걸린다. (상대적인 속도)
위에 글이 이해가 안된다면 링크의 영상(NVIDIA 에서 제공하는 GPU 와 CPU의 비교, 1분 30초 가량)을 참고하면 된다. (사실 이 영상이 이 글의 전체 내용이다.) (유튜브 플러그인 적용 후 아래 영상 첨부)
<동영상 1> NVIDIA GPU vs CPU 유튜브 영상
(하지만 이 영상에서의 CPU 역할의 굵은 페인트볼처럼 CPU 는 조잡한 작업을 하진 않는다. 오히려 한 코어 당 더 많은 작업을 한다고 생각하는 게 맞다.)
<참고 문헌>
<그림>
<동영상>
1. NVIDIA CUDA 소개 영상 (https://youtu.be/-P28LKWTzrI)