20nm 공정 세대의 NVIDIA 모바일 SoC

 

NVIDIA이 모바일 SoC(System on a Chip) 테그라 시리즈의 새로운 플래그쉽인 테그라 X1을 발표했습니다. 64비트 ARMv8 CPU 코어와 256개의 CUDA 코어를 지닌 GPU, LPDDDR4, 4K 디스플레이 지원을 갖춘 하이엔드 모바일 칩입니다. 64비트 CPU와 고성능 CUDA GPU, 광대역 메모리, 고해상도 비디오 엔진 등을 망라하는 2015년의 하이엔드 SoC입니다.

 

01.png

 

테그라 X1

 

테그라 X1에서 GPU 코어는 마이크로 아키텍처를 최신인 맥스웰로 변경해 CUDA 코어의 연산 유닛 수를 256개로 대폭 늘렸습니다. 아키텍처의 세대도 PC용 GPU와 동급입니다. GPU 코어의 연산 성능은 최고 1TFLOPS를 달성해 모바일 슈퍼 컴퓨터라 부르기도 합니다. 다만 아래에서 말하겠으나 1TFLOPS는 Packed FP16일 경우의 성능입니다. 또 최고 성능으로 작동할 때 전력 사용량은 10W 이하입니다.

 

제조 공정은 TSMC의 20nm SoC 프로세스로서 애플의 아이폰 6/6플러스의 A8 계열과 같습니다. 또 CPU 코어는 ARM의 64비트 확장을 포함하는 ARMv8 명령 세트 아키텍처가 됐습니다. ARM의 CPU 코어 IP인 Cortex-A57이 4코어며 Cortex-A53이 4코어인 4+4 구성으로 ARM의 big.LITTLE 솔루션과 비슷한 구성입니다(다만 big.LITTLE의 하드웨어/소프트웨어 구성과는 다름). 즉 CPU 코어가 8개, CPU는 연산 유닛이 256개인 SoC입니다. CPU 코어는 NVIDIA의 자체 설계 64비트 ARMv8 코어인 프로젝트 덴버가 아니라는 점이 재밌는데, 이건 다른 글에서 따로 설명하겠습니다. 

 

02.png

 

Cortex-A57의 개요

 

03.png

 

Cortex-A53의 개요

 

04.png

 

Cortex-A57의 파이프 라인

 

이번 프로세스로의 이행은 불규칙적인 것이며 단순히 28nm→ 20nm→ 16/14nm로 볼 순 없습니다. 파운드리 프로세스의 20nm와 16/14nm 공정은 배선층의 대부분을 공유하고 있으나 20nm가 평면 트랜지스터, 16/14nm가 FinFET 3D 트랜지스터입니다. 20nm의 장점은 16/14nm보다 1년 전에 프로세스가 시작됐다는 것이고 16/14nm의 장점은 전력 사용량이 더 낮다는 것입니다. 조금이라도 더 빨리 미세화된 프로세스를 원하는 모바일 SoC는 20nm로 가지만 대부분의 다른 제품은 보다 장점이 많은 16/14nm로 이행하려 합니다. 사실 IP의 충실도도 16/14nm가 높으며 20nm는 모바일 전용 프로세스가 됐습니다. NVIDIA도 애플이나 퀄컴과 마찬가지로 모바일에선 20nm를 선택했습니다. 

 

05.png

 

여러 프로세스 기술의 피치 비율

 

06.png

 

인텔과 파운드리의 프로세스 로드맵

 

 

모바일에 최적화된 맥스웰 아키텍처

 

NVIDIA는 28nm HPM 프로세스의 테그라 K1에서 케플러 GPU 코어 아키텍처를 사용했습니다. 케플러는 192개의 CUDA 코어가 1개의 SM(Streaming Multiprocessor)를 구성하는 아키텍처였습니다. SM에는 4개의 warp 스케줄러가 있으며 4warp에서 최대 8명령을 처리할 수 있습니다. 그 명령이 192개의 연산 유닛으로 처리되는 아키텍처였습니다.

 

07.png

 

테그라 K1에 탑재된 케플러 GPU 코어의 SM

 

케플러 아키텍처의 특징은 명령이 충분히 처리될 경우 연산 유닛을 최대한 활용할 수 있다는 점입니다. 바꿔 말하면 튜닝을 충분히 할 경우 명령 발행에 대한 연산 실행 효율을 높여 성능을 높일 수 있다는 이야기입니다. 그러나 실제로는 그만큼 효율 좋게 명령을 발행할 수 있는 경우는 많지 않으며 연산 유닛이 아이들 상태를 지키는 경우가 많았다고 봅니다. 또 복잡한 명령 처리 네트워크나 스케줄링은 그대로 하드웨어 오버 헤드로 이어집니다.

 

맥스웰 아키텍처는 케플러를 기반으로 하면서 그런 문제를 제거하고 GPU 코어를 보다 효율 좋은 마이크로 아키텍처로 만들었습니다. 명령 디스패치에 CUDA 코어를 1대 1로 대응시켜, 명령 스케줄링, 처리, 배선 네트워크가 간단해졌으며, 명령 발행 대비 연산 비율이 떨어져 연산 유닛이 불필요하게 아이들 상태를 지키는 일도 크게 줄었다고 합니다. 즉 맥스웰은 케플러보다 아키텍처적인 면에서 매우 효율이 높습니다. 사실 태생적으로 맥스웰이 케플러보다 모바일 SoC에 적합한 코어입니다. 왜냐하면 NVIDIA는 맥스웰에서 모바일을 전제로 깔고 아키텍처를 개발했기 때문입니다. 

 

08.png

 

테그라 X1에 탑재된 맥스웰 GPU 코어의 SM

 

09.png

 

맥스웰 아키텍처의 명령 스케줄링

 

10.png

 

케플러와 맥스웰의 명령 발행/실행 유닛의 비율

 

11.png

 

테그라 X1의 맥스웰 SM

 

12.png

 

2개의 SM으로 구성된 테그라 X1의 맥스웰 코어 

 

13.png

 

테그라 K1과 테그라 X1의 그래픽 구성과 성능의 차이

 

테그라 X1에 탑재된 맥스웰 코어는 128 CUDA 코어 SM이 2유닛으로 총 256 CUDA 코어의 구성입니다. NVIDIA는 케플러 GPU가 194 CUDA 코어를 쓴 SM인데 비해 성능은 2배 이상인데 아키텍처를 생각하면 크게 무리도 아닙니다. 테그라 X1의 맥스웰 SM은 기본적인 설계는 PC용 맥스웰 SM과 같으나 메모리 용량 등에 약간의 차이가 있습니다. 물론 제조 공정은 다릅니다. PC용 GPU 코어는 TSMC의 28nm HP 프로세스를 유지하고 있는데 테그라 X1은 TSMC의 20nm SoC 프로세스로 제조됩니다. 그래서 프로세스나 트랜지스터 옵션에서 전력 소비량이 줄어들 수밖에 없습니다.

 

모바일 케플러 코어는 텍스처 유닛 수가 PC 버전보다 줄었습니다. 그래서 테그라 X1의 맥스웰 코어는 테그라 K1의 케플러 코어보다 연산 대비 텍스처의 비율이 높아집니다. 또 테그라 K1 케플러에선 4유닛이었던 ROP(Rendering Output Pipeline)가 테그라 X1 맥스웰에선 16유닛으로 4배로 늘어났습니다. 당연히 메모리 대역에 부담을 주지만 메모리 인터페이스로 64비트 LPDDR4 3.2Gbps를 지원하기에 메모리 대역폭도 25.6GB/sec로 늘었습니다. 또 2 SM으로 구성되면서 지오메트리 파이프 라인도 2배로 늘었습니다.

 
14.png

 

모바일 메모리 대역의 로드맵

 

 

16비트 부동소수점 데이터 2개를 패키지해 연산

 

테그라 X1의 맥스웰 GPU 코어에서 가장 큰 특쟁은 Packed FP16(16비트 부동소수점 연산)의 지원입니다. 

 

CPU의 부동 소수점 연산에는 일반적으로 단정밀도라 불리는 FP32, 32비트 부동소수점(부호 1비트/지수 8비트/가수 23비트)와 배정밀도라 불리는 FP64, 64비트 부동 소수점(부호 1비트/지수 11비트/가수 52비트)가 사용됩니다. 하지만 그래픽에선 오래 전부터 FP16, 16비트 부동 소수점(부호 1비트/지수 5비트/가수 10비트)가 많이 쓰이고 있었습니다. 이는 사람의 눈이 인식하는 다이나믹 레인지의 상당 부분을 16비트 부동소수점으로 커버할 수 있어서 그렇습니다.

 

NVIDIA GPU 코어는 지포스 8800(G80)이후엔 FP32에 최적화된 CUDA 코어로 구성됐습니다. 따라서 기존의 CUDA 코어에선 1개의 FP16을 운영할 땐 1개의 FP32(32비트 부동소수점 연산) 코어로 실행됐습니다. 그래서 FP16의 산출량이 FP32와 같았습니다. 이 말인즉 FP16으로 연상 정밀도를 떨어트려도 FP32 성능이 올라가지 않았다는 이야기입니다. 

 

테그라 X1의 맥스웰 코어에선 이 부분을 크게 바꿔 FP16 운영의 산출량을 FP32의 2배로 했습니다. 1GHz로 동작 시 테그라 X1 GPU 코어에서 FP32의 성능은 512GFLOPS지만, FP16의 성능은 그 2배인 1TFLOPS입니다.

 

15.png

 

테그라 X1의 FP16 성능

 

다만 이 경우에 FP16은 2-wide 벡터형 Packed 포맷을 사용한 것입니다. GPU 용어로 이야기하자면 Vec2입니다. NVIDIA의 기존 명령 실행은 1-wide의 스칼라 오퍼레이션(실제로는 32-wide 벡터인데 프레디케이션에 따라 조건 분기가 가능한 스칼라처럼 보입니다)였습니다. 그러나 테그라 X1의 2-wide FP16는 SSE 같은 SIMD(Single Instruction, Multiple Data) 방식의 운영입니다.

 

구체적으로 테그라 X1 맥스웰에선 CUDA 코어의 32비트 레지스터를 2개로 분할해 어퍼 하프(상위)16비트와 로워 하프(하위)16비트에 각각 16비트의 FP16 데이터를 저장할 수 있도록 했습니다. CUDA 코어는 32비트 레지스터에서 2개의 FP16 원시 오퍼랜드를 읽어내 2개의 같은 FP16운영을 병행 실행합니다. 그리고 연산 결과를 다시 합쳐 32비트 레지스터에 저장합니다. 

 

16.png

 

16비트 부동소수점 연산 데이터를 2개 팩으로 실행하는 새로운 실행 모드

 

예를 들어 FMA이면 3개의 32비트 레지스터를 소스 오퍼랜드로 읽어 내 3개의 16비트 소스를 2셋트 꺼내 한게의 곱셈/덧셈 명령을 양쪽으로 나눠 실행해 나온 결과를 1개의 32비트 데스티네이션 레지스터에 입력합니다. 1개의 FP32 CUDA 코어가 2개의 FP16 운영을 병렬 실행할 수 있기에 테그라 X1의 FP16의 산출량은 FP32의 2배가 됩니다.

 

 

GPU에로 돌아오는 FP16의 성능

 

테그라 X1의 Packed FP16은 FMA, ADD(덧셈), MUL(곱셈) 같은 단순 명령에서 지원됩니다. 다시 말하면 모든 명령에서 슬 수 있는 건 아닙니다. 하드웨어적으로 CUDA 코어의 연산 유닛은 FP16을 지원하지만 초월 함수 등을 다루는 Super Function Unit(SFU)은 FP16를 지원하지 않는 것입니다.

 

FP16을 다루는 명령과 그렇지 않은 명령이 있기에 당연히 32비트 레지스터에 16비트 데이터를 팩하는 명령과 언팩하는 명령도 추가될 것으로 보입니다. 기존의 NVIDIA GPU와 달리 FP16에 대해서 벡터를 프로그래밍 모델에서 어느 정도 의식할 필요가 있다는 것입니다. 다만 FP16이 주요 목표로 하는 애플리케이션은 이미지처럼 팩 데이터가 기본이라 문제가 그리 크지 않을 것이라고 합니다.

 

팩 FP16의 도입은 NVIDIA GPU에선 과거로의 회귀처럼 보입니다. PC용 프로그래머블 GPU는 다이렉트 X 9 세대에서 부동소수점(FP) 포맷을 FP16부터 도입하기 시작했습니다. 또 현재와 같은 SIMT(Single Instruction, Multiple Thread) 스타일이 되기 전의 GPU는 4-wide packed Vec4 펙터 포맷에 특화된 프로세서였습니다. SSE 같은 32비트에서 4-wide의 SIMD(Single Instruction, Multiple Data) 구성을 발전시켜 부분적으로 분할해 다수의 명령을 실행할 수 있도록 했습니다. 그래서 FP32의 4-wide 벡터를 FP16의 8-wide 벡트 연산으로 사용하는 아키텍처도 많았습니다. 

 

현재도 ARM의 Mali-T6xx 이후에 나온 미드가드 아키텍처는 이 방식을 사용하고 있으며 4-wide의 128비트 벡터 유닛을 8xFP16과 4xFP32 모두 사용할 수 있습니다. FP16에선 FP32의 2배 산출량을 냅니다.

 

17.png

 

ARM Mali T600 계열의 ALU는 126비트 폭의 SIMD이며 FP16으로 분할 가능

 

현재 모바일 GPU는 FP16을 강화하는 쪽으로 가고 있습니다. Imagination Technologies도 PowerVR Series6(Rogue)에서는FP16의 산출량을 FP32와 같게 할 것이라 설명했지만, PowerVR 6/7에서는 FP16의 산출량이 FP32의 2배가 됐습니다. FP16의 성능이 미치는 영향이 PC용 GPU와는 다릅니다.

 

 

앞으로 모바일 GPU에서 중요한 연산 성능

 

왜 FP16의 성능이 모바일 GPU코어에서 중요한 것일까요. 여기에는 몇가지 이유가 있습니다. NVIDIA에게 있어 가장 중요한 이유는 이미지 인식 등의 이미지 프로세싱 응용 프로그램에서 FP16이 많이 사용되기에 그렇습니다. 이미지 인식은 연산량이 엄청나기에 데이터 양을 줄임과 동시에 연산 성능을 올릴 필요가 있습니다. FP16 처리에서 성능이 2배가 된다면 GPU를 이미지 인식 등의 처리를 하는데 쓰기 딱 좋을 것입니다. 

 

18.png

 

NVIDIA가 자동차를 위해 개발한 테그라 X1 기반 드라이브 CX 컴퓨터 모듈

 

NVIDIA는 현재 차량용 시스템을 모바일 SoC의 주요 목표로 잡았습니다. 자동차에서 GPU의 장점을 발휘할 수 있는 주요 부분 중 하나는 이미지 인식 시스템입니다. 오토 드라이브의 관건은 카메라로 촬영한 이미지 인식 처리에 있으며, FP16을 강화한 테그라 X1은 충분히 장점을 발휘할 수 있을 것입니다.

 

19.png

 

자동차의 컴퓨터에 요구되는 이미지 인식

 

그러나 전력 사용량이 매우 중요한 모바일 그래픽에서도 FP16은 유효합니다. 데이터 용량을 줄여 전력을 절약할 수 있기에 FP16의 장점은 크다 할 수 있겠습니다. 픽셀 처리에선 FP32까지의 정확도가 대부분의 경우 필요 없기 때문입니다. 실제로 NVIDIA도 테그라 4세대에서는 모바일 그래픽을 처리할 때 아직 FP32까지는 필요가 없다며 FP20 정도를 쓰고 있었습니다. NVIDIA 이외의 제조사가 FP16를 중시하는 것도 그런 이유 가 크다고 봅니다.

 

즉 이번에 NVIDIA는 부동 소수점 연산에서 16비트만 언급했지만 장기적으로는 16비트 정수 연산 성능도 중요해질 가능성이 있습니다. 그것은 센서에서 나오는 데이터가 16비트 이하의 정수 데이터인 경우가 많기 때문입니다. 8, 10, 12비트 정수 데이터는 16비트 정수 연산 유닛을 쓰는 게 32비트 정수 연산 유닛보다 더 효율적일 수 있습니다. 그러한 센서 데이터의 해석을 클라이언트 쪽에서 하게 되면 16비트 이하의 정수 연산 성능과 성능 대 전력비도 높여야 할 필요가 있을 것입니다. 

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