연산 성능 대비 메모리 대역폭의 비율이 크게 개선


NVIDIA의 차세대 GPU 아키텍처 파스칼은 지금까지의 NVIDIA GPU와 비교하면 그 특징이 두드러집니다. NVIDIA는 페르미-케플러-맥스웰 순으로 GPU 아키텍처를 발전시켜 왔습니다. 페르미와 케플러는 설계 사상이 크게 바뀌었습니다. 맥스웰은 케플러의 발전형이며 파스칼도 그 연장선상에 있습니다. 그러나 파스칼에서 강화된 점을 보면 맥스웰은 설계 사상이 확실하게 바뀌었음을 알 수 있습니다.

 

1.png

 

지난 4 세대 동안의 NVIDIA 테슬라 스펙 비교. GFLOPS는 기본 클럭에 따라 표기했으며 부스트 클럭에서의 성능은 괄호 안에 넣었습니다. 페르미는 쉐이더 프로세서 동작 클럭을 표기.

 

슈퍼 컴퓨터에 중요한 연산과 메모리 대역의 관계를 4세대의 테슬라 계열 GPU와 비교하면 아래 그림처럼 됩니다. 연산 성능은 GPU니까 FP32(32bit 단정밀도 부동 소수점 연산)로 나타냈습니다. 페므리 세대에서 케플러 세대로 가면서 NVIDIA GPU의 연산 성능에 대한 메모리 대역폭의 비율인 Byte / FLOPS은 절반으로 떨어졌습니다. 연산 성능의 성장을 메모리 전송 속도의 고속화가 따라 잡지 못했기 때문입니다.

 

2.png

 


4세대 테슬라 제품의 연산 성능과 메모리 ​​대역폭의 비교

 

맥스웰 세대에서도 GDDR5 메모리 전송 속도는 그대로 고정, 메모리 대역은 케플러 세대와 같은 288GB/sec에 머물렀습니다. 반면 FP32의 연산 성능은 오르면서 Byte/FLOPS 비율은 더욱 낮아졌습니다. 과거 2세대의 NVIDIA GPU 연산 성능은 올랐지만, 메모리 대역의 한계 때문에 점점 힘들어졌음을 알 수 있습니다. 메모리에 영향을 받는 애플리케이션의 효율이 나빠진 것이지요.

 

파스칼에선 그것이 크게 완화됐습니다. 맥스웰부터 파스칼로 가면서 연산 성능은 1.6배, 메모리 대역폭읒 2.5배 상승했습니다. 연산 대비 메모리 대역폭의 비율은 케플러 세대보다 높아졌습니다. 페르미 세대의 비율까진 아니어도, 계속해서 하락했던 Byte / FLOPS 비율이 급반전해 상승하기 시작했습니다.

 

더 중요한 점은 파스칼 세대에 GPU 내부의 레지스터 파일과 캐시도 대폭 늘어났다는 점입니다. 레지스터 파일은 맥스웰 세대의 GM200가 GPU 전체 6.1MB였는데 파스칼 세대 GP100는 14.3MB로 2.3 배 증가했습니다. 공유 메모리는 맥스웰 GM200의 2.3MB에 비해 파스칼 GP100는 3.6MB니 이것도 약 1.56배가 됐습니다. 반면 32bit 단정밀도 부동 소수점 연산 유닛은 맥스웰 GM200의 3072개에서 파스칼 GP100의 3,584개로 1.17배 밖에 증가하지 않았습니다. 상대적으로 연산 유닛에 대한 레지스터와 메모리의 양이 크게 늘었습니다.

 

3.png

 


지난 4세대 동안 NVIDIA의 테슬라 GPU에서 부동 소수점 연산 유닛 수와 내부 메모리 및 레지스터의 양을 비교

 

GPU 아키텍처 세대마다 유닛 수를 비교하면 맥스웰/케플러에서 파스칼로 가면서 연산 유닛 대비 레지스터 양이 비약적으로 증가했음을 알 수 있습니다. 파스칼 레지스터는 맥스웰의 2.3배, 케플러의 3.7배입니다.

 

 

내부에서 실행하는 스레드 수를 두배로

 

레지스터의 양이 늘어나면 GPU가 실행할 수 있는 스레드 수의가 늘어나게 됩니다. GPU는 물리 레지스터 파일의 양에 비례해서 시작할 수있는 스레드 수가 증가하기 때문입니다.

 

NVIDIA의 GPU는 Warp라는 쓰레드 배치 단위로 실행합니다. Warp는 컴퓨터 아키텍처로 말하면 논리 벡터로서, NVIDIA의 경우 32 엘리먼츠를 정리해 같은 명령을 실행합니다. 그런 의미에서 32-way의 SIMD(Single Instruction, Multiple Data)인 셈입니다.

 

그러나 Warp의 32개 레인은 겉으론 별도의 스레드처럼 실행되도, 마스크 레지스터를 사용한 프레디케이션에 의해 32-way의 각 레인마다 명령을 실행할지를 제어합니다. 따라서 GPU는 SIMT(Single Instruction, Multiple Thread) 실행이라고 부르고 있습니다.

 

간단히 말하면 단일 명령 스트림처럼 실행할 수 있는 스레드가 32개 모이면 Warp가 됩니다. 또한 상위 프로그래밍 모델에 대한 개념으로 최대 32개의 Warp로 구성하는 스레드 블록이 있습니다.

 

4.png

 

GPU의 SIMT (Single Instruction, Multiple Thread) 형 실행의 흐름 

 

GPU는 CPU와 다르게 스레드 당 레지스터 수가 고정되지 않습니다. 동적 할당이 가능하기에 초기의 GPU에서는 쓰레드 당 레지스터 수가 매우 적었습니다. 현재 NVIDIA GPU는 스레드 당 레지스터를 최대 255개까지 지정할 수 있습니다. 표준이 32 레지스터/스레드입니다. 따라서 같은 32 레지스터/스레드라면 레지스터 수가 많은 아키텍처가 더 많은 스레드를 시작할 수 있게 됩니다.

 

예를 들어 파스칼 GP100의 경우 GPU 전체에서 3,670,016 개의 레지스터를 갖춰, GPU 전체에서 3,584의 Warp를 제어할 수 있습니다. 각 Warp는 32스레드의 배치이기에 내부에서 제어할 수 있는 스레드 수는 GPU 전체에서 114,688개가 됩니다. 367만 레지스터에서 11.4만개의 스레드가 나오지요. 각 스레드마다 32개의 레지스터를 계산하는 것입니다.

 

5.png

 

NVIDIA가 4세대 동안 내놓은 테슬라에서 부동 소수점 연산 유닛 수와 Warp 수를 비교

 

파스칼 GP100에서 시작할 수 있는 Warp 수는 맥스웰 GM200과 비교하면 2.3 배, 케플러와 비교하면 3.7배 이상입니다. NVIDIA GPU의 연산 유닛 수는 케플러 이후 증가 속도가 줄어들지만, Warp 수가 크게 늘어난 것으로 나타났습니다. 

 

쉽게 말하면 파스칼에서 NVIDIA 아키텍처의 목적은 실행할 수 있는 스레드나 Warp 수를 늘리는 데 있습니다. 따라서 레지스터 파일의 양을 늘릴 필요가 있었습니다. 물론 레지스터를 늘리는 건 스레드에 배정되는 레지스터 수를 늘려서 간단히 해결할 수 있으나, 그보다는 Warp 수를 늘리는 걸 목표로 삼았습니다. 공유 메모리도 각 스레드마다 일정 용량을 늘려, Warp 수에 따라 공유 메모리 양도 늘었습니다.

 

 

큰 워크로드를 대응하기 위해 스레드 자원을 확대

 

물론 워크로드에 따라 이만큼 엄청난 수의 스레드를 필요로 하지 않는 것도 많습니다. NVIDIA GPU에서 개발을 지휘하는 Jonah Alben (Senior Vice President, GPU Engineering, NVIDIA)는 다음과 같이 설명합니다.

 

"원칙적으로는 설계상 자원의 양을 늘리면 그만큼 많은 코드를 실행시킬 수 있습니다. 그만큼 많은 코드를 실행시킬 필요가 없는 작업도 있을 것입니다. 그러나 작업에 따라 늘어난 자원을 활용할 수 있습니다. 설계 사상적으로, 우리는 200 ~ 300W의 전력 테두리 안에서 거의 모두가 기본적으로 필요로 하는 것이 확실한 자원 영역의 효율성을 추구 할 뿐만 아니라 리소스를 추가했습니다. 추가 된 리소스를 가지고 더 많은 코드를 실행시켜 다른 사용자의 요구에 부응합니다."

 

단순히 말하면 NVIDIA는 HPC(High Performance Computing) 처럼 연산 단위가 큰 워크로드에서도 효과를 볼 수 있도록 파스칼 아키텍처를 확장하고 있는 것 같습니다. 노드 당 11만개 이상의 스레드를 실행할 필요가 있는 작업처럼 말이지요. 가벼운 작업에선 불필요한 기능이라 해도, 그것을 필요로 하는 유력한 시장이 존재하는 한 자원을 강화할 방침입니다.

 

또한 그 배경에는 시대의 흐름에 따라 GPU 컴퓨팅이 필요한 워크로드의 규모가 커지고, 더 많은 자원이 필요할 것이라는 NVIDIA의 관측이 있습니다. 따라서 더 작은 작업도 쉽게 처리할 수 있도록 APU(Accelerated Processing Unit)화를 추진한 AMD와는 발상이 다릅니다. 간단히 말해서 AMD는 GPU가 수행하는 작업의 크기가 작지만 쾌적하게 이용할 수 있도록 하길 원하나, NVIDIA는 GPU가 실행하는 작업의 덩치가 클 때 최대한의 효율을 발휘할 수 있도록 발전해 왔습니다. 그리고 AMD의 방향성은 지금 바뀌고 있지요.

 

6.png

 

테슬라 P100(파스칼 GP100)의 전체 구성

 

7.png

 

테슬라 P100의 SM(Streaming Multiprocessor) 구성

 


메모리 액세스 지연 시간을 가려줄 스레드 확대

 

GPU의 레지스터 용량 변화는 메모리 액세스 지연 시간을 가려주는 것과도 관계가 있습니다. CPU와 GPU는 메모리 액세스 지연을 숨기는 방법이 다릅니다. CPU는 실행 지연이 중요하기에 캐시를 사용해 메모리 액세스의 지연 시간을 은폐합니다. 그에 비해 엄청난 수의 스레드를 병렬로 실행하는 GPU는 스레드의 병렬 메모리 액세스로 지연을 숨깁니다. 스레드가 메모리 액세스를 기다리며 셋업을 하는 동안에도 다른 스레드를 실행해 액세스 지연 시간을 감추는 것입니다.

 

현재의 GPU는 캐시도 탑재하고 있지만 여전히 멀티 스레딩으로 메모리 지연 시간을 숨기는 경향이 강합니다. 그리고 스레드에서 지연 시간을 감추기 위해선 많은 수의 레지스터가 필요합니다.

 

관점을 바꾸면 파스칼 세대 NVIDIA GPU는 메모리 대역폭이 크게 늘어나면서 스레드 수를 늘릴 수 있게 됐다고 봐도 무방합니다. 맥스웰/케플러 세대는 메모리 대역폭의 제약 때문에 Warp 수를 늘려도 액세스에서 효율이 떨어지는 경우가 생깁니다. 파스칼에선 메모리 대역폭 제약이 느슨해 Warp 수를 늘리면 메모리 액세스 지연 시간을 커버할 수 있는 것으로 보입니다.

 

덧붙여서 NVIDIA GPU의 내부 Warp 수와 레지스터 및 메모리 용량을 각각 32비트 단정밀도 부동소수점 연산 성능으로 비교하면 아래 그림처럼 됩니다. GFLOPS와 비교하면 레지스터 수와 Warp의 증가는 나름대로 비율이 잘 맞아 보입니다. 실제 GFLOPS을 향상시키려면 그만큼 스레드 수를 늘릴 필요가 있다는 발상도 볼 수 있습니다.

 

8.png

 

NVIDIA의 4세대 동안 테슬라에서 부동소수점 연산 성능과 Warp 수의 비교

 

9.png

 

부동소수점 연산 성능과 레지스터, 메모리의 비교

 


FinFET 화로 동작 클럭을 높여 성능을 향상. 케플러 세대의 2.2.배

 

파스칼에서 CUDA 코어(FP32 연산 유닛)의 수는 117% 밖에 증가하지 않았는데, FP32 성능이 1.63배로 증가한 이유는 클럭의 향상 덕분입니다.

 

동작 클럭이 그리 높지 않은 테슬라 중에서 테슬라 M40(GM200)의 클럭은 기본 948MHz, 부스트가 1114MHz입니다. 테슬라 P100(GP100)는 기본 1328MHz, 부스트 1480MHz에로 올랐지요. 즉 계속해서 동작하는 기본 클럭은 1.4배, 부스트 클럭은 1.32배로 올랐습니다. 케플러 세대의 테슬라 K40(GK110)과 비교하면 기본 클럭이 1.78배, 부스트 클럭이 1.69배가 됩니다.

 

10.png

 

4세대 동안의 테슬라에서 부동소수점 연산, 동작 클럭, CUDA 코어 수 비교

 

프로세서에서 파이프 라인 아키텍처를 바꾸고, 스테이지를 깊게 하면 동작 클럭을 높일 수 있습니다. 그러나 NVIDIA는 그런 설계를 부정합니다.

 

"맥스웰 세대는 케플러에 비해 동작 클럭이 올랐습니다. 이 이유 중 하나는 맥스웰의 전력 효율이 케플러보다 높아졌기 때문이며, 동작 클럭을 높일 여유가 생겨서입니다. 이번 파스칼은 FinFET 저전력 공정이라 자연스럽게 클럭을 높일 수 있었습니다. 우리는 더 깊은 파이프라인 같은 디자인은 시도하지 않습니다."

 

맥스웰은 TSMC의 FinFET 3D 트랜지스터, 16FF + 프로세스 효과로 성능 / 전력 효율이 크게 개선됐습니다. 따라서 동작 클럭의 향상만으로 CUDA 코어 수를 17% 늘리는 데 그쳤어도 성능은 63% 높일 수 있었습니다. 사실 많은 테슬라 사용자는 케플러 세대에 머물러 있기에 성능 향상 폭은 더 큽니다. 케플러의 테슬라 K40(GK110)에 비해 파스칼의 테슬라 P100(GP100)은 FP32에서 기본 클럭 2.2배, FP64는 3.3배, FP16은 4.4배의 성능입니다.

 

참고로 NVIDIA는 페르미 세대까지는 GPU 프로세서 코어 부분을 수동 설계해 동작 클럭을 다른 유닛의 2배로 높였습니다. 페르미 테슬라 M2090(GF100)에선 기본 클럭 650Mhz였으나 프로세서 코어는 1300Mhz로 동작시켰습니다. 파스칼의 동작 클럭은 페르미 세대의 프로세서 코어 클럭에 도달하게 됩니다.

기글하드웨어(http://gigglehd.com/zbxe)에 올라온 모든 뉴스와 정보 글은 다른 곳으로 퍼가실 때 작성자의 허락을 받아야 합니다. 번역한 뉴스와 정보 글을 작성자 동의 없이 무단 전재와 무단 수정하는 행위를 금지합니다.