GPU

[NVIDIA] GPU Architecture

H/W engineer_ beginner 2022. 1. 13. 17:22
SMALL

NVIDIA GPU Architectures 

 

[Figure 0] Jenson Huang NVIDIA CEO

 

 NVIDIA GPU의 Architecture는 세대를 거듭하며 빠른 속도로 발전해 왔습니다. 과거 그래픽 처리를 주 목적으로 했던 GPU에서 벗어나, 현재 (2022년) 전 세계 인공지능 반도체 시장을 선도하고 있는 NVIDIA GPU의 발자취를 따라가보며, GPU의 Architecture가 어떻게 발전되어 왔는지 정리해보려 합니다. (본 포스팅은 Instruction이 수행되는 Streaming Multiprocessor를 중심으로 정리하였습니다.) GPU는 인공지능 분야가 발전함에 따라 많은 양의 데이터를 병렬로 빠르게 처리하기 위하여 도입되었습니다. Throughput 기반의 Architecture라 불리는 GPU는 현재 높은 처리량이라는 강력한 장점을 내세워 인공지능 생태계에 빠르게 적응했고 현재 가장 강력한 인공지능 연산 장치(학습 및 추론)중 하나로 사용되고 있습니다. 

 

 초기 Tesla Architecture부터 Volta Architecture까지 GPU Architecture는 세대를 거듭하며 발전해왔습니다. 공정 기술의 발전과 메모리 기술의 발달에 힘입어 초기 3D 그래픽 가속을 위한 기술들은 다양한 형태의 새로운 기술의 발전으로 이어졌습니다. 세대를 거듭하며 그래픽 처리 뿐 만 아니라 GPGPU(General Purpose GPU)를 위한 기술이 추가되었고, HPC(High Performance Computing) 응용을 고려한 기술들이 추가었습니다. 최종적으로는 강력한 연산 처리 장치인 Tensor Core를 적용한 GPU가 등장하여 DL(Deep Learning)/AI Computing 분야의 대표주자로 우뚝 설 수 있었습니다. 현재 인공지능 처리를 위한 데이터 센터의 대부분은 NVIDIA의 GPU가 섭렵하고 있습니다. 향후 Google의 TPU처럼 필요한 상황에 최적화된 커스텀 칩과 경쟁을 벌이며 최후의 승자를 가리게 되겠지만, 현재 인공지능 기술 발전을 견인하고 있는 NVIDIA의 GPU Architecture 분석은 분명 유의미 한 공부라 판단됩니다. 

 

* 본 포스팅은 Reference [1] [2]의 창작물을 참고하여 만든 2차 창작물입니다.

* 최근 NVIDIA에서 제시한 'Turing Architecture'와 'Ampere Architecture'는 별도의 포스팅으로 다루겠습니다.

 


 

[1] Tesla(G80) / 2006

 

 Tesla Architecture에서 최초로 Vertex shader와 Pixel shader의 기능이 결합된 Unified shader가 등장했습니다. 이를 통해 프로그램 유연성이 증가할 수 있었습니다. 추가적으로 새로운 개념인 *GPGPU가 등장했고 GPU 상에서 그래픽 연산 외에 일반 연산을 가속할 수 있는 CUDA API가 등장하였습니다. 이 Architecture에서 Unified shader 혹은 GPGPU Program을 수행하는 기본 단위는 *Streaming Multiprocessor(SM)으로 각 SM 마다 독립적인 Instruction Scheduler를 사용하여 최대 768개의 Thread를 병렬로 동시에 실행 할 수 있습니다. 각 SM은 8개의 CUDA Cores로 구성되어 있으며 추가적으로 2개의 SFU, Shared memory가 부착되어 있습니다. 아래의 그림을 통해서 SM 하나가 Multi-thread 실행이 가능한 unified shader임을 확인할 수 있습니다. (하나의 TPC에 2개의 SM이 존재하다고 해서 두 SM이 동일 연산을 수행하는 것은 아닙니다.)

 

[Figure 1] Tesla Architecture의 SM 구조 : Reference [3]

 

* SM의 구성요소 

 하나의 Streaming Multiprocessor는 8개의 SP(Streaming processor)와 2개의 SFU(Special-Function units)로 이루어져있습니다. 추가적으로 하나의 MT issue(Multithreaded Instruction fetch and issue unit) 공간과 instruction cache, Read만 가능한 Constant cache, 16KByte 크기의 Read/Write shared memory가 존재합니다. 그림에 보이는 SM 하단의 Texture unit은 SM과 외부 메모리 간의 Load/Store 명령어 수행 시에 사용됩니다.

 

- SP : 기본적인 Logic / Arithmatic 연산 수행, MAD(Multiply-Add) 명령어를 지원하여 한 clk당 최대 2회 연산 가능

- SFU : 초월함수, Pixel arrtibute 보간 등의 연산 수행, 4개의 부동 소숫점 곱셈기 포함

- Shared memory : Graphics input buffers 또는 병렬 컴퓨팅을 위한 shared data 존재, 이를 통해 실행되는 Thread 간의 Data 교환을 가능하게 함

 

*GPGPU : General Purpose GPU

*SM : Streamin Multiprocessor : Multi thread를 실행할 수 있는 Unified shader

 


 

[2] Fermi / 2010 : 'GPGPU를 위한 발판'

 

 Fermi Architecture에서는 이전 Architecture에 비해 General Purpose Computing(GPGPU)을 위한 요소들이 대폭 적용되었습니다. 즉 GPGPU를 용이하게 하기 위한 요소들이 추가된 것인데 기존에 각 SM마다 제공되던 Shared memory의 용량을 추가했으며(16KB => 64KB), 이 중 일부를 L1 Cache로 설정해 사용할 수 있게되었습니다. (Cache를 사용한다면 Memory 계층구조의 특성을 통해 용량 제한에서 자유로워집니다.) 또한 SM 외부의 Texture unit에 의해 수행되었던 Load/Store 명령이 SM 내의 LD/ST Units으로 대체되며 SM 자체적으로 이 명령어들을 수행할 수 있게 되었습니다.

 

[Figure 2] Fermi Architecture의 SM 구조 / Reference [4]

 

 위의 그림은 Fermi Architecture의 SM 구조를 보여주는 그림으로 원래 SP(Streaming Processor)라 표기되었던 부분이 CUDA Core라는 이름으로 변경되고 그 수도 8개에서 32개로 증가했습니다. 한 SM 내에서 32개의 CUDA Core는 각 16개씩 2개의 그룹으로 나눠져있으며 LD/ST 1그룹과 SFU 1그룹을 포함해 총 4개의 그룹으로 나누어져 있습니다. 또한 Tesl Architecture에서는 하나의 SP 내부에 분산되어 존재하던 Register file들을 모아 밖으로 모아 CUDA Core 외부에 공간을 할당하여 배치하였으며 이를 통해 Register를 보다 효율적으로 사용할 수 있습니다. 

 

 Core(이전 Architecture에서는 SP 개념)의 수가 증가했다는 것은 GPU 내부적으로 더 많은 명령어들을 빠르게 공급해야할 필요가 생겼다는 것을 의미합니다. 따라서 *Warp Scheduler가 2개로 증가했으며 각 Warp Scheduler는 독립적으로 Dispatch Unit을 통해 명령어를 보낼 수 있습니다. 이론적으로 Dispatch Unit이 2개 이기 때문에 한 SM 내에서 2개의 명령어가 독립적으로 실행될 수 있지만 특별한 경우에 한해서는 하나의 SM 내에서 하나의 명령어만 처리하게 됩니다. (특별한 경우라 함은 1. 두 Warp Scheduler에서 사용하려는 실행 유닛 그룹이 겹치는 경우 2. 64Bit 부동소수점 연산을 사용하는 경우)

 

 Warp의 단위는 32개의 Thread인데 CUDA Core가 32개 단위로 묶인 것이 아니라 16개로 묶인 이유는 CUDA Cores와 LD&ST, SFU가 Warp Scheduler의 2배 클럭으로 동작하기 때문입니다. 때문에 한 Warp의 32개의 Thread 집합은 두 배 빠르게 동작하는 16개의 CUDA Cores에 할당되어 동작하게 됩니다. 이는 Tesla Architecture도 동일하며 Kepler Architecture에서는 Power Consumption 문제가 대두되며 Scheduler와 동일 클럭으로 동작하도록 변경됩니다.

 

*Warp : 같은 명령어로 동시에 실행되는 32개의 Thread의 모음으로 NVIDIA에서는 이를 'Warp'라고 칭함 (AMD의 'Wavefront'와 동일한 개념)  추가적으로 Warp가 존재한다는 것은 한 명령어로 여러 Thread가 실행됨을 의미함으로, 이 동작을 'SIMT(Single Instruction Multi Thread)'라고 함

 

[Figure 3] MAD(Multiply-Add) vs FMA(Fused Multiply-Add) / Reference [5]

 

 위의 그림은 Fermi Architecture에서 적용된 부동소수점 연산인 FMA(Fused Multiply-Add)를 설명하는 그림입니다. 이 연산 방법의 적용으로 부동소수점 연산의 정확도 향상을 성취할 수 있었습니다. 위 그림을 통해 MAD 연산과 FMA 연산의 차이를 확인할 수 있는데 MAD의 경우 중간 계산 결과의 하위 Bits를 버린 다음 최종 결과를 계산하는 반면, FMA 에서는 중간 결과의 모든 하위 Bits를 보존한 상태로 최종 결과를 계산합니다. 기존의 MAD 연산은 계산 결과가 FMA에 비해 부정확하여 그래픽 연산에는 문제가 없었지만 General purpose computing에는 적합하지 않았습니다. 하지만 Fermi Architecture에서 FMA 연산이 지원되며 GPGPU Computing에 대한 지원이 강화되었습니다.

 

 추가적으로 CUDA Core 내부에 부동소수점 연산 지원이 추가되어(FP unit) 부동소수점의 성능 또한 향상되었습니다. Tesla Architecture에서는 각 SM 마다 64Bit 부동소수점 연산 유닛을 Core 외부에 별도로 두었지만 Fermi Architecture에서는 CUDA Core 내부에 부동소수점 연산을 위한 Unit을 도입하여 32Bit  부동소수점 연산을 수행하는 CUDA Core 2개를 사용해 효율적으로 64Bit 부동소수점 연산을 수행할 수 있게 되었습니다. 

 


 

[3] Kepler / 2012

: 'Performance와 Power Consumption을 개선' HPC(High Performance Computing)를 위한 도약

 

 Kepler Architecture는 이전 Architecture에 비해 성능과 전력 효율을 개선시키는 것을 목표로 개발되었습니다. 클럭의 동작 속도는 전력 소모와 비례 관계에 있습니다. 그렇기 때문에 이전 Architecture에서는 CUDA Cores, LD&ST units, SFU 등이 다른 부분보다 2배 빠르게 동작했지만 Kepler Architecture 부터는 GPU 전체가 동일 클럭으로 동작하도록 변경되었습니다. 이는 GPU의 전반적인 클럭 속도 향상으로 이보다 두배 빠른 속도로 클럭을 동작시키는 것이 어렵고 전력 소모 면에서 큰 문제가 있기 때문입니다. 이전에는 2배 빠른 속도의 클럭을 사용해 성능 향상에 사용하였지만 절반 속도의 클럭으로도 동일한 성능 혹은 더 좋은 성능을 내기 위해선 실행 유닛의 갯수가 2배 이상이 되어야 합니다. 그렇기 때문에 Kepler Archiecture에서는 훨씬 더 많은 실행 유닛을 도입하였습니다.

 

[Figure 4] Kepler Architecture의 SMX 구조 / Reference [6]

 

 위의 그림은 Kepler Architecture의 Streaming Multiprocessor(SM)의 구조를 나타냅니다. Kepler Architecture부터 SM이 SMX라는 이름으로 변경되었으며 2배의 클럭 속도를 사용하지 않고 성능을 향상시키기 위하여 훨씬 많은 실행 유닛들을 도입했음을 확인할 수 있습니다. Kepler의 SMX에서는 192개의 CUDA Cores, 64개의 *64-Bit DP units, 32개의 LD&ST units, 32개의 SFU로 구성되어 있습니다. 늘어난 실행 유닛을 효과적으로 사용하기 위하여 Warp Scheduler의 갯수도 2개에서 4개로 증가했으며 각 Warp Scheduler unit에 대응되는 Dipatch unit 또한 1개에서 2개로 증가해 SMX에서는 동시에 최대 8개의 명령어를 처리하는 것이 가능해졌습니다. 또한 Register file 크기도 최대 128KB로 4배 가량 증가했으며 L1 Cache의 크기 또한 128KB로 Fermi SM의 2배가 되었음을 알 수 있습니다. 추가적으로 하나의 Thread가 사용할 수 있는 최대 Register의 수가 63개에서 255개로 늘어났는데 이는 DP unit의 갯수가 증가한 것과 더불어 그래픽 연산보다 High Performance Computing(HPC) 응용 분야의 성능 향상을 위한 변화라고 판단됩니다.

 

 또한 명령어 처리 효율 향상을 위하여 명령어 Scheduling 방법에도 많은 변화가 생겼습니다. 아래의 그림은 이전 Architecture인 Fermi와 새롭게 제시된 Kepler의 Scheduling 방법을 비교한 그림입니다.

 

[Figure 5] Fermi Architecture scheduling vs Kepler Architecture scheduling / Reference [7]

 

 Fermi Architecture의 경우 CUDA Core, LD/ST unit, SFU 내부의 파이프라인 상에서 진행중인 명령어들의 수행이 완료되었는지 확인하는 Scoreboard 회로와 이를 바탕으로 다음에 실행될 명령어 사이의 Dependency를 동적으로 확인하는 Dependency Check 회로가 존재했습니다. 이는 명령어들이 파이프라인 상에서 진행될 때 명령어 사이의 Dependency 때문에 Data hazard가 발생하는 상황을 예방하기 위한 회로입니다. 하지만 Kepler Architecture에서는 한 번에 처리하는 명령어가 4개에서 8개로 늘어나고 실행 유닛 그룹의 갯수 또한 크게 증가했기 때문에 위의 조건을 모두 고려해 회로를 설계한다면 Scheduling 회로의 복잡성이 너무 증가하게 됩니다. 하여 Kepler에서는 Compiler에 미리 명령어 실행을 완료하기 위한 필요 Cycle 수를 명령어와 함께 사용하여 다음에 실행할 명령어를 선택함으로써 Scoreboard와 Dependency check 회로 없이 간단한 방법으로 Scheduling을 구현할 수 있었습니다.

 

*64Bit DP Units : 64Bit 부동소수점 연산을 위한 Double Precision units으로 High Performance Computing(HPC)를 위해 도입됨, Fermi Architecture과 달리 32-Bit 연산과 64-Bit 부동소수점 연산이 동시에 실행될 수 있어 성능이 크게 향상됨

 

 


 

[4] Maxwell / 2014, 2015 : '미세 공정 도움 없이 Kepler Architecure 최적화'

 

 Maxwell Architecture가 발표되던 시기는 이전 세대의 GPU Architecture가 발전하던 방향과 조금 다른 방향으로 GPU의 개발이 이루어졌습니다. Kepler Architecture 까지는 데스크탑에서의 사용을 최우선으로 고려하여 발전이 진행되었다면 Maxwell Architecture 에서는 이를 Mobile device에 최적화 하려는 노력이 있었습니다. 또한 이전 Architecture의 경우 세대를 거듭하며 공정 기술의 발달이 동반되며(전보다 더 적은 공간에 더 많은 Tr을 배치할 수 있었음) 클럭 속도를 높이거나 CUDA Core의 갯수를 늘려 성능을 향상시키는 것이 가능했다면 Maxwell Architecture가 도입되는 시점에는 반도체 공정이 28nm에 머물러 있었습니다. 때문에 Maxwell Architecture에서는 공정 기술의 발달에 의한 이득을 볼 수 없었기에 Kepler Architecture를 최적화 하는 방향으로 개발이 진행되었습니다.

 

[Figure 6] Maxwell Architecture의 SMM 구조 / Reference [8]

 

 위의 그림은 Maxwell Architecture의 SMM 구조입니다. Kepler Architecture의 SMX에서 192개였던 CUDA Cores의 갯수가 128개로 크게 줄었는데 이는 Kepler Architecture의 SMX에서 Dispatch Unit에 비해 CUDA Cores의 갯수가 너무 많아 CUDA Cores utilization 저하가 발생했기 때문으로 판단됩니다. (Dispatch unit에 비해 너무 CUDA Cores가 많아 연산이 실행될 때 쓰이지 않고 놀게 되는 CUDA Cores가 발생함) NVIDIA의 분석에 따르면, CUDA Cores의 수를 192개에서 128개로 대폭 줄이더라도 SMM의 성능 저하는 10%정도 밖에 되지 않는다고 합니다. Shared memory 관련해서도 변화가 있었는데 이전 Architecture에서는 Shared memory의 일부를 L1 Cache로 설정해 사용할 수 있었지만 Maxwell 부터는 Shared memory와 L1 Cache가 분리되었습니다. (L1 Cache는 texture cache로도 사용됩니다.) 

 

 SMM 내부의 CUDA Cores의 갯수가 줄어들었기 때문에 하나의 SMM이 차지하는 면적 또한 줄어들었습니다. 따라서 SMM의 갯수를 두배로 늘렸지만 칩 전체가 차지하는 면적을 이전 아키텍쳐의 2배보다 작게 배치할 수 있었습니다. Kepler Architecture의 GK104 GPU의 경우 8개의 SMX를 탑재하여 1536개(8 x 192)의 CUDA Cores를 갖고 있는 반면 Maxwell Architecture의 GM204의 경우 그 2배인 16개의 SMM을 탑재하고 있습니다. 따라서 GM204는 총 2048개(16 x 128)의 CUDA Cores를 갖게 됩니다. 칩의 면적은 두 모델 모두 CUDA Cores의 수에 거의 비례하지만 Maxwell Architecture에서 SMM의 수가 두배로 늘었기 때문에 1.8배에 준하는 성능 향상을 도출할 수 있었습니다. (이론상 Peak 성능은 아닙니다.)

 

 Maxwell SMM에 적용된 큰 변화 중 하나는 64Bit 부동소수점 연산을 위한 Double precision unit의 갯수가 Kepler의 SMX에 비해 크게 줄어들었다는 점입니다. Warp Scheduler 하나 당 1개의 DP 유닛이 존재하는 것으로 판단되는데 이 때문에 Maxwell Architecture와 64Bit 부동소수점 연산 성능은 32Bit 연산 성능에 비해 1/32 수준으로 크게 후퇴하였습니다. 이는 많은 사용자들이 사용하는 FP32 연산의 중요성을 강조한 조치라 판단됩니다.

 

[Figure 12] Kepler Architecture의 data path(좌) vs Maxwell Architecture의 data path(우) / Reference [14]

 

 Maxwell Architecture에는 전력 효율을 위한 최적화 기법 또한 적용되었습니다. 위의 그림은 Kepler Architecture의 Dispatch Unit과 실행 유닛 사이의 연결 구조와(좌) Maxwell Architecture의 연결 구조(우)입니다. 그림을 통해 알 수 있듯이 Kepler Architecture의 경우 모든 실행 유닛이 하나의 crossbar 스위치로 연결되어 있습니다. 이런 경우 8개의 Dispatch unit들은 각각 어떤 실행 유닛이든 자유롭게 접근 할 수 있는 장점이 있지만 모든 node를 연결한 crossbar가 칩에서 큰 면적을 차지하게 됩니다. 많은 면적을 차지하기에 많은 전력을 소비하게 되고 전력 소비를 효율적으로 하기 위해서 Maxwell Architecture에서는 Dispatch unit과 실행 Unit들 사이를 구분해 배치하였습니다. Maxwell Architecture의 경우 SMM에서 실행 유닛들을 4 그룹으로 분류하고 4 쌍의 Ditpatch unit이 각 그룹 중 하나만 접근할 수 있도록 제한하였는데 이런 경우 한 쌍의 두 Dispatch unit이 동일 실행 unit을 사용하려 하는 경우 하나의 명령어밖에 실행하지 못할 가능성이 높아지지만 이로 인한 성능 저하보다 전력 소모와 칩 면적 감소에 더 집중하였음을 알 수 있습니다.

 

 전력 소비 효율 증대를 위한 또 다른 변화는 L2 Cache의 크기가 이전 Architecture에 비해서 512KB에서 2MB로 크게 늘었다는 것입니다. 프로세서 외부 메모리인 GDDR5의 전력소모는 얼마나 자주 메모리에 접근하는 지에 영향을 받게 되는데 L2 Cache의 용량을 늘림으로써 외부 메모리 사용을 줄여 GPU 전체의 전력 소모를 줄일 수 있었습니다. 

 

 


 

[5] Pascal / 2016 : 'Deep Learning Boom, GPU를 새로운 혁신으로 이끌다.'

 

 Pascal Architectue가 등장한 시기는 이미 전세계 적으로 딥러닝 붐이 일어났던 시기입니다. 많은 기업들이 AI 분야에 GPU를 사용하였고 이와 관련한 개발자도 빠르게 늘었습니다. NVIDIA는 GPU에 국한된 것이 아니라 AI회사로 불리기 원했는데 '2016 GPU Tech Conference' 내용을 보더라도 3D 그래픽 관련 내용보다 딥러닝과 AI에 관련된 내용에 훨씬 많은 발표 시간을 할애함을 알 수 있습니다. 따라서 NVIDIA에서는 딥러닝 프로그램에 적합한 Architecture 구현을 위해 많은 노력을 했습니다. Pascal Architecture의 Streaming Multiprocessor는 이전 세대와 달리 두 가지 종류로 나뉘어 발표되었는데 이는 HPC(High Performance Computing) 분야와 그래픽 분야에서 요구되는 성능이 달라졌기 때문입니다. 딥러닝 혹은 HPC 응용 프로그램들은 FP64연산과 FP16연산(64bit, 16bit 부동소수점 연산) 성능이 중요하며 하나의 Thread가 많은 레지스터를 사용하는 것이 중요하지만, 그래픽 분야의 Shader 프로그램에서는 FP32만을 주로 사용하고, 프로그램이 상대적으로 간단하기 떄문에 레지스터 수를 늘려도 성능에 큰 영향을 미치지 않습니다. 

 

[Figure 7] GP100 Pascal Architecture의 SM 구조 / Reference [9]

 

 위 그림은 GP100 Pascal Architecture의 Streaming Multiprocessor의 구조를 보여주고 있는데 Maxwel의 SMX에 비해 한 SM 당 CUDA Cores를 비롯한 실행 유닛의 갯수는 반으로 줄었습니다.(64개) 실행 유닛의 수가 반으로 줄어들었지만 레지스터 파일의 크기는 그대로 유지되었는데 이를 통해 Warp Scheduler 하나 당 접근할 수 있는 레지스터는 두배로 늘어 Pascal의 SM에서 실행되는 Thread는 이전보다 더 많은 레지스터를 사용할 수 있습니다. 또한 공정 기술이 28nm에서 16nm로 발전하여 GPU 내에 탑재되는 SM의 수가 크게 증가했는데 Kepler Architecture의 경우 16개 혹은 24개의 SMM을 탑재했지만 Kepler Architecture의 경우 무려 56개의 SM을 탑재하고 있습니다. 많은 SM을 사용하여 DL 연산의 경우 신경망 연산에서 12배 이상 빨라졌고 이전 Architecture에 비해 딥러닝 추론 처리량이 약 7배 증가했습니다.

 

 GP100모델에 적용된 Pascal Architecture의 경우 HPC(High Performance Computing) workroad 지원을 목표로 설계되었기 때문에 FP64의 성능이 다시 강조되었습니다. (정확한 연산 결과를 요구하는 HPC 분야의 경우 Double precision인 FP64연산이 중요합니다. ex.정확한 과학적 연산 결과 도출 등) Maxwell Architecture에서 FP32 성능 대비 1/3 혹은 1/32였던 FP64 성능이 Pascal에서는 1/2로 크게 향상되었습니다. 추가적으로 딥러닝 연산에서 더 많은 연산을 빠르게 하기 위하여 FP16연산을 새롭게 도입하였는데, 이는 FP16 연산을 통해 딥러닝의 Traning과 Inference에서 더 높은 Throughput을 내기 위한 조치라 판단됩니다. FP100 Pascal에 사용된 CUDA Core의 경우 FP16연산을 처리할 때 한 Cycle에 두 명령어를 처리할 수 있기 때문에 FP16 연산은 FP32 연산에 비해 두 배 빠르게 처리될 수 있어 계산 속도 면에서도 큰 장점이 있습니다. (기존의 Architecture에서는 FP16연산을 위해서 32Bit 크기의 공간 중 16Bit만 사용하고 나머지 16Bit는 버리는 공간이었음) FP16연산의 경우 *Half precision에 사용되는 연산인데 연산의 정확도가 결과에 큰 영향을 미치지 않는 DL 분야에서 Half precision의 경우 매우 효율적으로 사용될 수 있음이 많은 연구 결과로 밝혀졌습니다. (높은 precision의 연산을 수행할 경우 연산의 정확도는 높지만, 낮은 precision을 사용하여 더 많은 Throughput을 내는 것이 DL 연산 성능에 더 큰 영향을 미침) 

 

[Figure 8] NVIDIA 에서 사용하는 Precision format / Reference [10]

 

 

*Half precision : 컴퓨터에서 소수를 표현하는 방식 중 하나로 소수를 32bit data로 표현하는 것이 Single precision, 64bit data로 표현하는 것이 Double precision, 마지막으로 16bit data로 표현하는 것이 Half precision

*HPC 연산 vs DL 연산 : HPC 연산의 경우 정확한 연산 결과를 요하기 때문에 Double precision(FP64) 연산을 요하지만, DL 연산의 경우 높은 처리량이 목표이기 때문에 Half precision(FP16) 연산이 효율적임. 이 두 연산은 이론적으로 상반되는 워크로드를 가짐


 

[6] Volta / 2017 : 'Tensor Cores의 등장, NVIDIA를 Deep Learning acceleration의 정점으로'

 

 Volta Architecture의 경우 12nm의 FinFET 공정으로 구현되었으며 엄청난 수(약 211억개)의 Transistor를 탑재하고 있습니다. 또한 DL 가속을 위한 새로운 연산 유닛인 Tensor Cores의 도입으로 Volta Architecture에서 혁신적인 성능 향상을 이룰 수 있습니다. Tensor Cores의 경우 DL 가속을 위해 특별히 제작된 Core 입니다. Tensor Cores는 16Bit의 부동소수점 연산으로 이루어진 매트릭스 D를 계산하는 동작을 Pascal에 비해 12배 높은 Throughput으로 처리할 수 있습니다. 딥러닝 연산의 경우 Neural Network의 각 Layer와 Node 사이의 Weight를 이용해 다음 Layer로의 출력을 계산할 때 매트릭스 연산이 사용되기 때문에 이를 가속하기 위한 전용 Core의 존재는 DL 연산에 매우 혁신적인 요소입니다.

 (Volta architecture의 경우 공정기술의 성장과 새로운 연산 유닛의 도입 외에도 Thread 실행, Thread Scheduling 기법, Core layout, Memory controller, ISA 면에서도 기존의 Architecture에 비해 상당한 차이를 보입니다.)

 

[Figure 9] Tensor Core / Reference [12]

 

 아래의 그림은 Volta architecture의 SM 구조를 나타내고 있습니다. 새로운 Architecture에서 Chip당 84개의 SM이 포함되어 있습니다. 기존의 CUDA Cores의 경우 FP32 Cores로 이름이 변했고 기존 Architecture에서 가장 많은 부분을 차지했던 FP32 Core와 동일한 수의 정수 연산 Cores(INT Core)가 추가되었는데 이는 DL 연산의 가속을 위한 요소입니다. FP64 Cores의 경우 Pascal Architecture와 동일한 비율로 FP32 Cores의 절반이 탑재되었으며 Warp Scheduler마다 2개의 Tensor Core가 짝을 이루고 있음을 확인할 수 있습니다. 추가적으로 전에 없던 L0 Cache가 추가되었음을 확인할 수 있습니다. 

 

[Figure 10] Volta Architecture의 SM구조 / Reference [13]

 

 추가적으로 Pascal Architecture 까지는 하나의 Warp를 이루고 있는 32개의 Thread는 반드시 동시에 진행을 했지만 Volta Architecture의 경우 아래 그림과 같이 하나의 Warp 내에서 32개의 Thread 각각이 독립적인 PC(Program Counter)를 갖고 독립적으로 진행하는 것이 가능해졌습니다. 이는 원래 Warp scheduler와 짝을 이루던 Dispatch unit의 수가 변한 이유중 하나로 판단됩니다. 위와 같은 변화가 생겼던 이유는 실행 유닛의 종류가 다양해지면서 (FP16, FP32, FP64, INT Core, LD&ST, Tensor Core, SFU) 각 실행 유닛 별 Latancy 차이로 발생하는 비효율을 피하기 위한 조치라 판단됩니다. 

 

[Figure 11] Volta Architecture의 Thread Scheduling 변화 / Reference [13]

 


 

Conclusion

 

 Streaming Multiprocessor의 구조는 GPU Architecture가 발전하며 함께 성장해 왔습니다. 초기 Tesla, Fermi Architecture 시기에는 GPU의 동작 속도가 현재보다 느렸고 공정상의 제약 때문에 칩 면적을 효율적으로 사용하는 것이 중요했습니다. 때문에 SM을 두배 빠른 속도로 동작시켜 원하는 성취를 이룰 수 있었습니다. 하지만 Kepler Architecture가 도입되며 칩이 차지하는 면적보다 전력 효율 문제가 대두되며 SM을 두배 빠르게 동작시키는 방법 대신 CUDA Cores의 수를 두배로 늘려 원하는 성취를 이루었습니다.(이는 공정 기술의 발달에 영향을 받았습니다.) 하지만 다음 Architecture인 Maxwell의 경우 Kepler와 동일한 28nm의 공정을 계속 사용했기 때문에 Kepler Architecture를 철저하게 분석해 SM 하나 당 필요한 CUDA Core의 갯수를 최적화 했으며 효율성과 성능을 향상시켰습니다. (하지만 FP64 연산 성능은 이전보다 안좋아졌습니다.) 딥러닝 붐이 일어난 시기에 등장한 Pascal Architecture는 DL 연산을 위한 자원을 늘리기 위하여 FP16 연산 성능을 FP32 연산에 비해 두 배로 늘렸으며(FP16연산은 FP32 연산보다 정확도는 떨어지지만 더 많은 Throughput을 낼 수 있습니다.) Warp Scheduler 하나가 접근할 수 있은 Register 파일 또한 두 배로 늘렸습니다. Volta Architecture의 경우 DL 연산을 더욱 가속하기 위해 새롭게 도입된 개념인 Tensor Core가 적용되었으며 4x4 매트릭스 연산을 Pascal 보다 무려 12배 빠르게 수행할 수 있었습니다. *Tensor Core 관련 자세한 내용은 이전 포스트를 참고해주세요. 

 

 


Reference

[1] http://www.donghyun53.net/nvidia-gpu-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98-%eb%b3%80%ec%b2%9c%ec%82%ac-%ec%83%81%ed%8e%b8/

[2] http://www.donghyun53.net/nvidia-gpu-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98-%eb%b3%80%ec%b2%9c%ec%82%ac-%ed%95%98%ed%8e%b8/

[3] Lindholm, Erik, et al. "NVIDIA Tesla: A unified graphics and computing architecture." IEEE micro 28.2 (2008): 39-55.

[4] Aila, Timo, Samuli Laine, and Tero Karras. "Understanding the efficiency of ray traversal on GPUs–Kepler and Fermi addendum." Proceedings of ACM High Performance Graphics (2012): 9-16.

[5] “NVIDIA’s Next Generation CUDA Compute Architecture: Fermi”, White Paper

[6] “NVIDIA’s Next Generation CUDA Compute Architecture: Kepler TM GK110/210”,  White Paper

[7] https://www.anandtech.com/show/6446/nvidia-launches-tesla-k20-k20x-gk110-arrives-at-last/3

[8] https://developer.nvidia.com/blog/maxwell-most-advanced-cuda-gpu-ever-made/

[9] "Whitepaper, NVIDIA Tesla P100, The Most Advanced Datacenter Accelerator Ever Built Featuring Pascal GP100, 

the World’s Fastest GPU”

[10] https://www.nvidia.com/en-us/data-center/pascal-gpu-architecture/

[11] https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/ 

[12] Youtube "GTC 2017: NVIDIA Announces Tesla V100 (NVIDIA keynote part 6)”

[13] https://www.anandtech.com/show/11367/nvidia-volta-unveiled-gv100-gpu-and-tesla-v100-accelerator-announced 

[14] http://www.donghyun53.net/nvidia-gpu-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EB%B3%80%EC%B2%9C%EC%82%AC-%ED%95%98%ED%8E%B8/

 

LIST

'GPU' 카테고리의 다른 글

[NVIDIA] CUDA Cores vs Tensor Cores  (0) 2022.01.07