[NVIDIA GPU] Mixed Precision Programming

By | 2017-02-22

Pascal GPU (and CUDA 8)에서 16bit FP (Floating Point)와 8/16bit INT (Integer) 연산이 가능해졌다. 많은 HPC (High-Performance Computing) 애플리케이션은 높은 정밀도 연산이 필요해서 32bit (FP32 or Single Float) 또는 64bit (FP64 or Double Float) FP연산을 사용한다. 제한적인 애플리케이션에서는 128bit 또는 256bit FP 연산을 사용하기도 한다. 하지만, 최근 쟁점이 되는 Machine Learning (Deep Neural Network) 연산의 경우 16bit FP 연산 정밀도만으로도 충분히 만족할 만한 결과가 나온다고 한다.

16bit (FP16 or Half Precision) FP 데이터 형식을 사용하면 32bit와 64bit FP 대비 메모리 사용량 및 데이터 로딩 시간이 감소한다. 또한, Deep Neural Network의 경우 8bit INT를 사용해도 정확도에 큰 차이가 없다고 한다. Deep learning에 사용되는 센서들의 경우 8bit 연산 정밀도 정도만 필요하다고 한다.

Mixed precision 연산이란 여러 precision 연산이 가능한 것을 의미한다. Pascal GPU에서는 vector instruction을 추가하여 기존 32bit datapath를 사용하여 FP16, INT8, INT16연산을 지원한다. Vector instruction은 하나의 SIMD (Single Instruction Multiple Data) instruction으로 여러개의 연산을 동시에 수행하는 것을 의미한다. NVIDIA Pascal에서는 2개의 FP16 연산, 2개의 INT16 연산, 4개의 INT8 연산 수행이 가능하다. NVIDIA는 SIMD를 사용하여 execution throughput이 2배 또는 4배가 증가하였다고 발표하였다.

Floating Point Precision

Floating point는 real number를 컴퓨터가 이해할 수 있는 근삿값(approximated)으로 표현하는 방법이다. Floating point는 sign bit, exponent big, mantissa bit로 구성되어 있다.

fp16_representation-624x49그림 1: FP16 bit 구성

IEEE 754 standard 기준

  • 16bit – 1 sign bit + 5 exponent bits + 10 mantissa bits
  • 32bit – 1 sign bit + 8 exponent bits + 23 mantissa bits
  • 64bit – 1 sign bit + 11 exponent bits + 52 mantissa bits

Floating point의 더 상세한 정보는 위키피디아에서 읽으면 됩니다 (참조)

32bit FP의 경우 최대 20억 개의 다른 수를 표현할 수 있다. 반면 16bit FP의 경우 최대 3만 개 정도의 수만 표현이 가능하다. 결과적으로 16bit는 32bit 대비 부정확한 수치를 표현한다. NVIDIA에서 32bit 대신 16bit를 사용하는 가장 큰 이유는 성능 때문이다. 32bit FP 연산 한 번에 2개의 16bit FP 연산을 수행할 수 있으므로 throughput이 정확히 2배 증가하게 된다.

Low Precision Integers

모든 application이 high dynamic range (많은 수를 표현하는?) 와 high precision (높은 정확도)를 요구하지 않는다. C short와 char 같은 같은 data type을 사용하는 application의 경우 integer 연산만으로 구현할 수 있다.

dp4a_dp2a-624x223그림 2: NVIDIA Pascal Architecture에서 지원하는 Low Precision Integer 연산

위 그림은 Pascal GPU에서 지원하는 low precision integer 연산 예를 보여준다. DP4A의 경우 4개의 8bit INT 연산을 수행한다. DP2A의 경우 16bit INT 과 8bit INT 연산을 수행한다. 위와 같은 연산은 matrix multiplies, convolution 계산에 자주 사용된다. 특히 Deep Neural Network의 경우 convolution 연산이 많은 편이다.

Mixed Precision Performance on Pascal GPUs

tesla_pascal_numerical_throughput-624x93그림 3: Mixed Precision Performance on Pascal GPUs

위 그림은 Pascal GPU의 성능을 보여준다. GP100은 DP4A와 DP2A의 연산을 지원하지 않아서 성능이 표시되어 있지 않다. GP100의 경우 FP16의 높은 성능을 보이나 다른 GPU에서는 double precision과 비슷한 성능을 보인다. 아마 GP100에서만 FP16 연산을 지원하는 것 같다.

출처

  1. https://devblogs.nvidia.com/parallelforall/mixed-precision-programming-cuda-8/
  2. ttps://en.wikipedia.org/wiki/Floating_point

 

Leave a Reply

Your email address will not be published. Required fields are marked *