안녕하세요~


이번글은 GPGPU라는 개념과 CUDA를 소개하면 GPU구조를 가볍게 살펴볼거에요.




<1.GPGPU>


CPU는 다양한 시스템 자원(ex; I/O device)를 제어해야하고 복잡한 명령들을 처리해야하기 때문에 연산을 위한 장치 이외에도 다른 구성요소들이 존재해요. 


하지만 GPU는 본래 그래픽처리를 위해 고안된 장치였기 때문에 단순한 연산들을 병렬로 고속처리가 가능했었죠. (CPU처럼 제어기능이 필요없기 때문에 복잡한 구조를 버리고 연산(ALU)에 특화시킨 장치로 활용되기 시작한거죠. 그렇기 때문에 GPU는 단독으로 시스템자원을 활용할 수 없어 CPU의 제어를 받아야해요.)


예를들어, 다차원 행렬과 같이 병렬적으로 연산처리가 가능한 과학계산에서도 유용하게 쓰일 수 있다는 사실을 발견했던거죠.


이렇게 단순히 그래픽처리만 하는 GPU와 달리 병렬로 연산기능까지 수행하게 되면서 GPU를 GPGPU(General Purpose GPU)라고 부르기 시작했답니다. "그래픽처리+과학연산" 개념을 묶어서 GPGPU라고 부르긴 하지만 다시 GPU라고 부르고 있어요.


<사진1.GPU 초록색 부분이 ALU를 의미하며 일반적으로 core라고 부른다>







<2.CUDA(Compute Unified Device Architecture)>


(GP)GPU의 등장으로 병렬계산을 뒷받침해줄 소프트웨어가 필요했어요.

과거 GPU를 그래픽용도로만 사용했을때는 OpenCL, DirectX라는 병렬 소프트웨어가 있었는데 이를 구사하기 위해서는 독특한 언어(HLSL, GLSL 등)을 배워야했으며 그래픽스 목적으로 만들었기 때문에 이래저래 공부할것도 많았죠.


(GP)GPU 개념이 등장하면서는 C/C++ 언어로 병렬계산에 필요한 기능들을 제공해주는 소프트웨어가 만들어졌어요. 대표적인 소프트웨어가 NVIDIA의 CUDA입니다. 그래서 딥러닝을 하시거나 머신러닝을 하시는 분들은 먼저 tensorflow, pytorch 등의 프레임워크를 설치하실 때 CUDA 먼저 설치해야 했던거에요!



CUDA가 진행되는 방식을 설명드려볼게요.


1)병렬처리할 데이터들을 main memory에서 GPU memory로 이동시킨다.

2)CPU는 GPU에게 GPU memory에 있는 데이터를 연산하라고 명령한다.

3)GPU는 CPU가 명령한 연산처리를 병렬로 수행한다.

4)GPU가 작업을 다 마치면 다시 GPU memory에 결과물을 저장하고, 다시 main memory로 해당 결과물을 업로드한다. 그리고 CPU가 main memory에 접근해 해당 결과물을 이용하여 작업을 마무리한다.


<사진2>




CUDA는 기본적으로 CPU와 GPU 코드를 조합해서 코딩합니다. CUDA는 NVCC(NVidia CUDA Compiler)라는 NVIDIA 독점 컴파일러를 통해 CPU에서 수행되는 코드(.c(C)/.Cpp(C++))와 GPU에서 수행되는 코드(.cu)가 분리되어 컴파일이 됩니다. 



<사진3>


그리고 Linker에 의해 하나의 실행파일(binary file)이되어 CPU에서는 Serial Code로, GPU에서는 Parallel code로 순차실행이 됩니다. (이런 과정 때문에 앞서 언급한 CPU, GPU간의 병목현상이 일어납니다.)



<사진4>



<사진5>






<3.cuDNN>


하드웨어 가속이란 컴퓨팅 일부 기능을 CPU에서 구동하는 소프트웨어 방식보다 더 빠르게 수행할 수 있는 하드웨어의 사용을 말합니다. 예를들면, GPU의 블리팅 가속 기능이 있죠. 블리팅 가속이 뭔지 몰라도 컴퓨팅의 일부 기능을 GPU에서 한다고 생각하시면 될 것 같아요. 보통 하드웨어 가속은 GPU를 활용하기 때문에 GPU 가속이라고 합니다.


GPU 가속장치는 그래픽 처리 장치, 부동 소수점 장치 등이 있고, 이들로 인해 빠른 연산을 가능하게 합니다 (부동 소수점 이야기는 다음 글에서 하도록 할게요~)


(GP)GPU는 복잡한 연산을 하기 위한 방향으로 발전되고 있어요. 그 대표적인 예가 딥러닝 연산이죠. 

딥러닝 연산을 고려하는 하드웨어가 발전하면 이를 뒷받침해주는 딥러닝 기반 소프트웨어도 발전해야겠죠? 그래서 나온 라이브러리(소프트웨어)가 cuDNN ((NVIDIA) CUDA Deep Neural Netowkr)이에요. (cuDNN 역시 NVIDIA에서 만들었답니다). 그렇기 때문에 딥러닝 관련 연산을 빠르게 해줄 수 있도록 도와주는 라이브러리로 구성되어 있답니다.


좀 더 정확히 NVIDIA가 정의한 cuDNN은 아래와 같아요.


"The NVIDIA CUDA Deep Neural Network library (cuDNN) is a GPU-accelerated library of primitives for deep neural networks."


"cuDNN provides highly tuned implementations for standard routines such as forward and backward convolution, pooling, normalization, and activation layers."


"cuDNN accelerates widely used deep learning frameworks, including Caffe2, Keras, MATLAB, MxNet, PyTorch, and Tensorflow."






<사진6>






지금까지 GPGPU, CUDA, cuDNN을 통해서 실제로 GPU가 과학연산에서 어떻게 실행되는지 알아봤어요.

다음 글에서는 본격적으로 NVIDIA GPU 모델 아키텍처에 대해 설명해보도록 할거에요. 


다른 GPU 모델도 있지만 최근에 보편적으로 사용하는 모델이 NVIDIA GPU 모델이기 때문에 NVIDIA GPU 모델을 살펴보도록 하겠습니다~





[글 래퍼런스]

http://haanjack.github.io/cuda/2016/02/26/gpgpu-cuda.html


[사진 래퍼런스]

사진1

https://namu.wiki/w/GPGPU

사진2

https://ko.wikipedia.org/wiki/CUDA

사진3

https://hw-lab.com/nvidia-announces-cudax86.html

사진4

https://www.slideshare.net/npinto/iap09-cudamit-6963-lecture-01-gpu-computing-using-cuda-david-luebke-nvidia-presentation

사진5

https://www.slideshare.net/maheshkha/cuda-tutorial

사진6

https://news.developer.nvidia.com/cudnn-7-5-now-available/

+ Recent posts