728x90

CUDA (Computed Unified Device Architecture)는 NVIDIA에서 개발한 GPU 개발 툴이다. 사실 CUDA는 c, c++기반으로 짜여진 완전 기초적 H/W 접근을 해야하는데, 많은 연구자들이 딥러닝에 사용할 수 있도록, 쉽게 설치할 수 있도록 오픈하였다. 현재는 nvidia-driver, CUDA, CUDNN만 설치하면 딥러닝을 쉽게 사용할 수 있다. 


CUDA를 사용하는 이유는 매우 간단한데, 많은 양의 연산을 동시에 처리하는 것이 목표이다. 그러므로 딥러닝, 채굴과 같은 수학적 계산에 많이 쓰인다. 미분은 컴퓨터로 가능하기 때문이다.


기존의 컴퓨터 연산은 CPU를 사용하고, RAM에 의존하여 연산을 진행하였다. CPU를 이용한 연산은 대부분 Single-Core(Human-Brain)를 사용하고 MultiProcessing, Multi-Threading 등을 이용하여 CPU가 보유한 코어 갯수 만큼의 Multi-Core를 이용하여 연산을 할 수 있다. 일반적으로 딥러닝에서 사용하는, 특히 pytorch나 tensorflow 에서, data loader 파트에서, core 갯수를 주고 데이터 loading 하는 부분이 여기에 속한다.



이에 반해 GPU는 Core 갯수가 엄청나다. CPU는 8~16개인데 비해 GPU는 몇 천개 이상이다. 즉 이를 이용한 Many-Core dependent 연산을 진행하고, 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 코어 이상이었다.



많은 연구자들이 사용하는 python, matlab 같은 경우 행렬 연산을 사용할 수 밖에 없다. 이 때 쓰이는 것이 재귀연산 (recursive 연산)인데, 이 함수는 '직렬' 연산을 해야한다. 하지만 이런 경우가 아니고 단순 계산, 예를 들어 backpropagation을 진행하며 보는 미적분 같은 경우 병렬 연산을 해주는 것이 훨씬 효과적이다. 

행렬 연산



위의 경우 (4,4) 행렬이다. 연산이 더 빠른 직렬 연산의 경우에 대해 살펴보겠다. (1,1) 위치에 더해질 숫자 (1)를 입력 후 행/열 순으로 증가하며 previously adding 된 각 행에 더한다고 하면, (1,1) 위치의 덧셈 이후 (2,1)의 덧셈을 진행할 때 마찬가지로 이전에 더했던 값을 알아야 된다. 그러므로 연산이 순차적으로 진행되어야 한다. 이런 경우에는 병렬 연산에는 적합하지 않고, 단일 코어의 속도가 높은 CPU를 이용한 연산이 더 유리하다,


(4,4)행렬 모든 성분에 만약 1의 값을 더한다는 연산 process에 대해 논해보자. 직렬 연산의 경우 이 연산을 16번 (4,4 행렬이므로) 해야 끝나지만, 병렬 연산의 경우 16번의 연산을 병렬인 한 번에 처리한다. 즉 같은 값을 더해 주기 때문이다. 


앞서 언급한 CPU와 GPU의 코어 수, 속도로 살펴보았을 때, 코어 당 속도가 CPU가 GPU의 2배라고 가정하자. 이럴 경우 CPU로 연산하면 8의 시간이 걸린다고 하였을 경우(0.5 x 16), GPU를 이용하면 1의 시간이 걸린다. (1 x 1)


아래의 영상을 보면, NVIDIA에서 제공해주는 CPU와 GPU의 비교 영상이다.

NVIDIA에서 공개한 GPU vs CPU



https://youtu.be/-P28LKWTzrI

728x90

+ Recent posts