bfloat16 부동 소수점 연산, 하드웨어로 구현하기

by DD
1개월 전
조회수 6

부동 소수점 연산에 대한 깊이 있는 이해를 위해, IEEE 754 표준(IEEE 754 Specification), NaN, 무한대, 서브노멀(Denormal) 숫자 등 핵심 개념을 설명함.

bfloat16 형식의 하드웨어 구현을 목표로, 최적화된 듀얼 패스 덧셈기(Dual Path Adder) 설계 및 ASIC 구현 과정을 상세히 제시함.

C++ 표준 라이브러리의 bfloat16 구현 방식과 하드웨어 모델 간의 차이점을 분석하고, 테스팅 과정(Testing Process)에서 발생한 문제점을 설명함.

ASIC 설계 과정에서 LZC(Leading Zero Count) 최적화를 위한 다양한 시도를 소개하며, 툴의 성능에 대한 통찰력을 제공함.

부동 소수점 표현 방식과 IEEE 754 표준

게시글은 부동 소수점 표현 방식의 기본 원리를 설명하며, 특히 IEEE 754 표준을 중심으로 논의를 전개한다. 부호 비트(Sign Bit), 지수(Exponent), 가수(Mantissa)로 구성된 부동 소수점 표현 방식을 소개하고, +0과 -0, NaN(Not a Number), 무한대(Infinity)와 같은 특수 값의 표현 방식을 설명한다. 또한, 다양한 라운딩 모드(Rounding Modes)의 동작 방식을 상세히 설명하며, 이러한 개념들이 하드웨어 설계에 미치는 영향을 분석한다.

bfloat16 형식의 하드웨어 설계 및 최적화

저자는 bfloat16 형식의 부동 소수점 연산을 위한 하드웨어 설계를 상세히 설명한다. 특히, 듀얼 패스 덧셈기(Dual Path Adder) 아키텍처를 통해 성능을 최적화하는 과정을 제시한다. 덧셈기를 close path와 far path로 나누어 설계하고, RZ(Round Towards Zero) 라운딩 모드를 사용하여 하드웨어 복잡도를 줄이는 방법을 설명한다. 또한, ASIC 구현 과정에서 면적과 타이밍(Timing)을 고려한 최적화 기법을 소개하며, LZC(Leading Zero Count) 회로의 설계 및 성능 개선 과정을 상세히 설명한다.

C++ 표준 라이브러리의 bfloat16 구현과 문제점

게시글은 C++ 표준 라이브러리의 bfloat16 구현 방식과 하드웨어 모델 간의 차이점을 분석한다. C++ 표준 라이브러리의 bfloat16은 float32_t를 기반으로 구현되어, 내부 정밀도(Internal Precision)가 다르기 때문에 하드웨어 모델과의 결과가 일치하지 않는 문제를 지적한다. 이러한 차이로 인해, 테스트 과정에서 정확도 문제(Accuracy Issue)가 발생할 수 있음을 강조하며, ulp(unit of last place) 개념을 사용하여 오차 범위를 정량적으로 분석한다.

ASIC 구현 과정에서의 경험과 툴의 활용

저자는 실제 ASIC 구현 과정에서 겪은 경험을 공유하며, 툴의 성능에 대한 통찰력을 제공한다. 특히, Yosys 툴을 사용하여 LZC(Leading Zero Count) 회로를 최적화하는 과정을 설명한다. 트리 기반 LZC(Tree-based LZC) 대신, priority mux를 사용한 casez 구문을 사용하여 성능을 개선한 사례를 제시한다. 또한, Tiny Tapeout을 활용한 칩 테이프아웃(Tapeout) 경험을 공유하며, IHP 130nm sg13g2 및 sg13cmos5l 노드를 사용한 설계를 비교 분석한다.

bfloat16의 장점과 하드웨어 설계 시 고려 사항

게시글은 bfloat16 형식의 장점을 강조하며, 하드웨어 설계 시 고려해야 할 사항들을 제시한다. bfloat16은 16비트의 작은 크기로 인해 메모리 대역폭(Memory Bandwidth) 제한을 극복하는 데 유리하며, AI 워크로드(AI Workload)에서 정밀도 손실에 대한 민감도가 낮다는 점을 언급한다. 또한, bfloat16의 비표준성(Non-Standard)으로 인해, 하드웨어 구현 시 다양한 선택이 가능하다는 점을 지적하며, RZ 라운딩 모드, NaN 및 무한대 지원 여부, 서브노멀(Denormal) 지원 여부 등을 결정하는 과정을 설명한다.

Floating point from scratch: Hard Mode