bfloat16 부동 소수점 연산, 하드웨어로 구현하기
저자는 부동 소수점 연산에 대한 깊이 있는 이해를 목표로, 하드웨어 구현에 도전함
IEEE 754 표준을 따르지 않는 bfloat16 부동 소수점 형식을 선택하고, RZ(Round Towards Zero) 모드, NaN 및 무한대(Infinity) 미지원 등 최적화된 설계를 적용함
이중 경로 덧셈기(Dual Path Adder) 아키텍처를 활용하여 성능을 향상시키고, ASIC(Application-Specific Integrated Circuit) 구현을 위한 설계 최적화를 수행함
C++ 표준 라이브러리의 bfloat16 구현 방식과 하드웨어 구현 간의 정확도 차이(Accuracy Difference)를 분석하고, 테스트 방법론을 제시함
부동 소수점 표현 방식과 IEEE 754 표준
저자는 부동 소수점 표현 방식을 심층적으로 이해하기 위해, IEEE 754 표준을 기반으로 하는 부동 소수점 형식의 내부 구조를 분석한다. 특히, 부호 비트(Sign Bit), 지수(Exponent), 가수(Mantissa)로 구성된 부동 소수점 표현 방식을 설명하고, 단정밀도(float32_t) 및 반정밀도(float16_t)와 같은 다양한 부동 소수점 형식의 필드 크기를 비교한다. 또한, 0과 NaN(Not a Number), 무한대(Infinity)와 같은 특수 값의 표현 방식을 설명하며, 이러한 표현 방식이 연산 결과에 미치는 영향을 분석한다.
bfloat16 부동 소수점 형식의 선택과 설계 최적화
저자는 AI 가속기 설계를 위한 부동 소수점 연산 하드웨어를 구현하기 위해, IEEE 754 표준을 따르지 않는 bfloat16 형식을 선택한다. bfloat16은 16비트 크기로, 7비트의 가수(Mantissa)와 8비트의 지수(Exponent)를 사용하며, float32_t에 비해 메모리 대역폭 제한을 극복하는 데 유리하다. 또한, RZ(Round Towards Zero) 모드만을 지원하고, NaN 및 무한대(Infinity)를 지원하지 않음으로써 하드웨어 복잡성을 줄이고, 성능을 최적화한다. 이러한 설계 결정은 AI 워크로드의 특성을 고려한 것으로, 정밀도 손실에 덜 민감하면서도 더 넓은 표현 범위를 필요로 하는 AI 연산에 적합하다.
이중 경로 덧셈기(Dual Path Adder) 아키텍처
저자는 bfloat16 덧셈 연산을 위한 하드웨어 아키텍처로, 이중 경로 덧셈기(Dual Path Adder)를 채택한다. 이 아키텍처는 지수 차이가 작고 유효한 뺄셈이 필요한 경우(close path)와 그렇지 않은 경우(far path)를 분리하여, 성능을 향상시킨다. 특히, RZ(Round Towards Zero) 모드만을 지원하므로, 반올림(Rounding) 관련 로직을 제거하여 하드웨어 복잡성을 줄인다. 또한, NaN 및 무한대(Infinity)를 지원하지 않으므로, 예외 처리 관련 로직을 제거하여 하드웨어 면적을 최적화한다. 이러한 설계는 고성능 FPU(Floating Point Unit)를 위한 일반적인 아키텍처로, 80년대부터 사용되어 왔다.
C++ 표준 라이브러리 bfloat16 구현과 정확도 문제
저자는 하드웨어 구현의 정확성을 검증하기 위해, C++ 표준 라이브러리의 bfloat16을 활용한 테스트 환경을 구축한다. 그러나 C++ 표준 라이브러리의 bfloat16은 float32_t를 기반으로 구현되어, 내부 정밀도(Precision)가 다르기 때문에, 하드웨어 구현 결과와 정확히 일치하지 않는 문제가 발생한다. 구체적으로, float32_t는 24비트의 내부 정밀도를 가지는 반면, bfloat16은 8비트의 정밀도를 가지므로, 동일한 입력 값에 대해 다른 반올림(Rounding) 동작이 발생할 수 있다. 저자는 이러한 차이로 인해 발생하는 상대 오차를 분석하고, 테스트 결과의 해석에 주의를 기울인다.
ASIC 구현 및 최적화
저자는 bfloat16 연산을 위한 하드웨어를 ASIC(Application-Specific Integrated Circuit)으로 구현하기 위해, 다양한 최적화 기법을 적용한다. 특히, 하드웨어 면적과 타이밍(Timing)을 고려하여, 성능을 극대화하는 설계를 목표로 한다. 예를 들어, LZC(Leading Zero Count) 회로를 트리 기반 대신, 우선순위 멀티플렉서(Priority Mux)를 사용하여, 회로 복잡성을 줄이고, 타이밍을 개선한다. 또한, IHP 130nm sg13g2 공정 기술을 활용하여, 100MHz의 동작 주파수를 목표로 하는 설계를 구현한다. 이러한 최적화 과정을 통해, 저자는 고성능의 bfloat16 연산 하드웨어를 구현하고, ASIC 설계의 어려움을 극복한다.