GPU

[NVIDIA] CUDA Cores vs Tensor Cores

H/W engineer_ beginner 2022. 1. 7. 19:48
SMALL


Introduction

 GPU(Graphics proccessing unit)는 그래픽 연산을 빠르게 처리하기 위해 고안된 그래픽 처리 장치입니다. 이 용어는 1999년 NVIDIA사에서 'geforce 256 model'을 발표하며 처음 사용하기 시작했으며 현재는 다양한 Data sets를 병렬로 처리해야하는 인공지능 연산 분야에서 그 사용성이 입증되며 광범위한 분야로 확장되고 있습니다. NVIDIA는 이런 GPU의 범용성을 인지하고 GPU를 단순히 그래픽 연산을 처리하기 위한 장치가 아닌, CPU처럼 'General Purpose(범용적)'으로 사용하기 위해 많은 공을 들였습니다. 또한 C, C++와 같은 고급 언어로 프로그래밍할 수 있도록 *CUDA라는 병렬 컴퓨팅 플랫폼을 세상에 공개했습니다.

 

[Figure 1] CPU vs GPU

 

 CPU와 마찬가지로 GPU 내부에도 연산을 처리할 수 있는 Core들이 존재합니다. 하지만 CPU와 GPU Core 구성에는 큰 차이가 존재합니다. CPU는 하나의 Core가 순차적으로 직렬 처리되는 프로세스를 효율적으로 처리하기 위해 만들어졌습니다. 즉, 단일 Core 성능을 GPU와 비교한다면 월등히 뛰어나다고 할 수 있습니다. 하지만 GPU는 병렬 처리를 기반으로 한 아키텍쳐를 채택해 설계되었기 때문에 여러 Data들을 병렬로 효율적으로 처리할 수 있습니다.(위의 이유로 GPU를 Throughput 기반의 Architecture라고 부르기도 합니다.) CPU보다 더 단순한 Core들로 구성되어 있지만 CPU가 일반적으로 1에서 8개의 Core를 갖는 것에 비해 GPU는 보통 수백에서 수천 개의 Core를 갖습니다. 때문에 많은 양의 Data sets를 병렬로 처리해야 하는 AI 연산에 GPU가 선호되고 있습니다. GPU의 Core는 더 작은 용량의 Cache, 작은 Instruction set, 낮은 Clock rate를 갖습니다. 그렇지만 CPU보다 매우 많은 Core가 밀집되어 있기 때문에 병렬 처리에 유용합니다. GPU 내에서 CUDA Core의 수는 더 좋은 Computing performance를 낼 수 있다는 말과 동일합니다. 하지만 GPU의 서로 다른 세대 간의 성능을 비교할 때는 단순히 Core의 수 만으로 비교할 수는 없습니다. GPU 안에서도 세대를 변화하며 단일 Core의 성능이 달라지기 때문입니다. 최신 NVIDIA GPU 안에는 세 가지 종류의 Core가 존재합니다. (1) CUDA cores (2) Tensor cores (3) Ray-Tracing cores 각 Core 들은 서로 다른 목적을 위해 설계되었습니다. 하여, 이번 게시글을 통해 CUDA cores와 Tensor cores 의 차이점에 대해 알아보고 각 Core가 GPU 성능에 미치는 영향에 대해 고찰하려 합니다.

 

*CUDA : Compute Unified Device Architecture


CUDA cores?

 GPU 상에서 CUDA Cores가 하는 일은 근본적으로 CPU 내부의 Core가 하는 일과 유사합니다. (하지만 CPU와 달리 Instruction을 가져오거나 Decodeing 할 수는 없습니다.) 

 

[Figure 2] CPU vs GPU

 

 구조적으로 CPU는 큰 크기의 Cache memory와 함께 한 번에 몇 개의 Thread를 처리할 수 있는 소수의 Core로 구성됩니다. 이와 대조적으로 GPU는 수천 개의 Thread를 동시에 처리할 수 있는 수백에서 수천 개의 CUDA Core로 구성됩니다. 이를 통해 GPU는 CPU보다 훨씬 많은 작업을 빠르게 처리할 수 있으며 이런 특징을 통해 AI분야의 Deep Learning 연산에서 핵심적인 역할을 맡을 수 있었습니다. 일반적으로 CUDA Cores는 Tensor Cores에 비해 느리지만 fp32 연산을 수행하기 때문에 더 정확한 연산을 수행할 수 있습니다. (Tensor Cores 는 fp16 연산이기 때문에 계산 정확도를 어느 정도 희생해야 합니다.)

 

 그렇다면 CUDA Cores 가 GPU의 성능에 어떤 영향을 미칠까요? 단순히 CUDA Cores의 수로 GPU의 성능을 판단하기에는 많은 제한 조건들이 있습니다. 어떤 GPU Architecture를 채택했는가 부터 *GPU Clock speeds, Memory Bandwidth, Meory speed, TMUs, *VRAM, ROPs 등은 성능에 영향을 미치는 요소들 입니다. 하지만 동일한 GPU Architecture 내에서는 이런 조건들이 비슷하기 때문에 CUDA Cores의 수로 성능을 비교할 수 있습니다. 많은 CUDA Cores는 Performance bottleneck 현상을 일으키는 다른 요인이 없는 경우 같은 Generation에서 더 좋은 성능을 의미합니다. 하지만 다른 Generation 사이에서 성능을 비교하는 경우는 이와 상황이 다릅니다. 예를 들어 GTX 1070은 GTX 780과 거의 동일한 수의 CUDA Core를 갖고 있지만 성능 면에서 월등한 차이를 갖고 있습니다. 이런 성능 차이는 단일 Core의 성능 차이와 세대를 거듭하며 발전하는 제조 공정 차이, 트랜지스터의 크기 차이 등에 기인한 것으로 판단됩니다. GTX 980 Ti(Maxwell architecture)와 GTX 980 Ti(Pascal architecture)의 경우는 비슷한 수의 CUDA Core와 Transistor가 존재하지만 트랜지스터의 크기가 이 둘의 성능을 비교하는 데에 결정적인 역할을 했습니다. 더 작은 Transistor를 사용하는 Pascal architecture의 전력 소비 감소로 작은 공간에 많은 트랜지스터를 집적할 수 있었으며 이를 통해 최대 Clock frequency를 증가시킬 수 있었습니다. Clock frequency의 증가로 단일 Core가 더 빠르게 작업을 수행할 수 있었으며 이는 두 Architecture 간의 성능 차이로 이어졌습니다.

 

 NVIDIA에서 자사의 GPU Cores를 CUDA Core로 명명한 것 처럼 AMD 사에서는 이를 Stream Processor라고 부릅니다. 두 회사의 Architecture가 근본적으로 다르게 설계되었기 때문에 CUDA Cores의 수와 Stream processor의 수만 보고 성능을 비교할 수는 없습니다. 하지만 Benchmark simulation을 통해 두 Architecture의 성능을 보다 정확히 비교할 수 있습니다. 

 

*GPU Clock speeds : Core Clock speed(GPU 동작 속도)와 Memory Clock speed(VRAM 동작 속도) 

*VRAM : GPU를 통해 처리되는 assets, textures, shadow maps등을 포함한 모든 Data를 저장합니다. DRAM, SSD, HDD에 비해 접근성이 좋고 빠릅니다.

 


Tensor cores?

 Tensor cores란 NVIDIA에서 개발한 행렬 곱셈 프로세스를 가속하는 처리 장치 입니다. CUDA Cores가 1 Core Clock에 하나의 fp32 부동소수점 연산을 수행하는 것에 비해 Tensor Cores는 같은 Term 동안 4 x 4 크기의 fp16 행렬 두 개를 곱하고 그 결과를 4 x 4 fp32 행렬에 더하는 Matrix multiply-accumulate 연산(A와 B를 곱하고 C를 더하는 과정을 하나의 연산으로 수행)을 수행합니다.

 

[Figure 3] Matrix Multiply-Accumulate 연산

 

 이 과정에서 fp16 행렬을 입력 받고 fp32 행렬을 출력하기 때문에 Mixed precision이라고 불립니다. 또한 이 연산은 Rounding이 한번 일 때 FMA(Fused Multiply-Add)라고 불리기도 합니다. 각 Tensor core는 한 번의 GPU Clock에 64개의 부동소수점 연산을 하는데 이는 출력 행렬의 한 원소를 계산하기 위해 4 개의 FMA 연산이 필요하고 총 4 x 4 (16개)의 원소가 존재하기 때문입니다. 

 

[Figure 4] FMA 연산

 

  Tensor Cores라는 이름에서 'Tensor' 의 의미는 무엇일까요? Tensor란 다차원의 Data sets 를 저장할 수 있는 컨테이너로 행렬의 확장으로 생각할 수 있습니다. 행렬은 숫자를 포함한 2차원 구조이지만 Tensor는 숫자의 다차원 집합으로 표현됩니다. 

 

[Figure 5] Tensor

 

 모든 마이크로 프로세서는 산술 및 논리 연산을 수행합니다. 이 중 중요도가 높은 산술 연산 중 하나는 바로 행렬 곱셈 입니다. 하지만 2개의 4 x 4 행렬의 곱셈을 수행하려면 이론적으로 64개의 곱셈 연산과 48개의 덧셈 연산이 필요합니다. 그렇기 때문에 NVIDIA는 연산의 정확도를 희생하여 더 많은 연산을 빠르게 수행할 수 있는 Tensor Cores를 세상에 출시하였습니다. NVIDIA의 Volta Architecture에서 이 기술이 최초로 적용되었으며 그 이후의 Architecture에도 이를 적용하여 훨씬 빠르게 연산을 수행할 수 있게 되었습니다.

[Figure 6] Turing Tensor Cores (Int8, Int4 연산 추가)

 

 Tensor Cores는 Clk 주기 당 여러 작업을 한 번에 수행할 수 있으며 CUDA Cores 보다 훨씬 높은 처리량(Throughput)을 수행합니다. 기계 학습 분야의 경우 비용과 계산 속도 면에서 Tensor Cores의 성능은 CUDA Cores를 크게 앞지르고 있으며 AI 연산 분야와 그 응용 분야들에서 널리 사용되고 있습니다. 

 CUDA Toolkit에서 제공하는 라이브러리인 cuBLAS와 cuDNN에서는 Tensor Cores를 지원하고 있습니다. cuBLAS는 행렬과 행렬의 곱셈 연산인 GEMM 연산에 Tensor Cores를 이용하고 cuDNN 에서는 Convolution 연산에 이를 이용하고 있습니다. 실험 결과 Tensor Cores는 cuBLAS에서 4에서 9배, cuDNN에서 4에서 5배의 성능 향상을 이끌었습니다. Tensor Cores가 처음 적용된 Architecture인 Volta의 model 중 Titan V는 5120개의 CUDA Cores와 640개의 Tensor Cores를 갖고 있습니다. 하나의 Tensor Core 는 한 Cycle에 64개의 FMA를 수행하며 이는 한 번에 128개의 부동소수점 연산을 수행하는 것과 같습니다. 따라서 Titan V 의 경우 640개의 Tensor Cores가 있으므로 Cycle마다 128 x 640 개의 부동소수점 연산을 수행할 수 있습니다. Turing Architecture의 경우 딥러닝 추론 속도 향상을 위하여 INT8과 INT4 연산을 추가했는데 이를 통해 연산에 필요한 비트 수를 대폭 줄이고 연산 속도를 극적으로 향상시키는 Quantization 기법을 적용하였습니다. 

 


Reference

[1] https://blogs.nvidia.com/blog/2009/12/16/whats-the-difference-between-a-cpu-and-a-gpu/ 

[2] https://www.techcenturion.com/nvidia-cuda-cores/

[3] https://www.techcenturion.com/tensor-cores/

[4] https://developer.nvidia.com/blog/programming-tensor-cores-cuda-9/

 

LIST

'GPU' 카테고리의 다른 글

[NVIDIA] GPU Architecture  (1) 2022.01.13