더북(TheBook)

038 단일 곱셈 누산기(Fused Multiply Add)

 

(a * b) + c라는 수학적 계산은 행렬 곱셈에 꼭 필요하고, 고성능 컴퓨팅(High-Performance Computing, HPC)과 AI 애플리케이션, 머신러닝, 딥러닝, 신경망 등에 자주 쓰인다.

가장 단순하게는 아래처럼 *+ 연산자를 그대로 써서 구현한다.

double x = 49.29d;
double y = -28.58d;
double z = 33.63d;
double q = (x * y) + z;

위 구현의 가장 큰 문제점은 두 건의 반올림 오류(곱셈 연산과 덧셈 연산에서 각각 하나씩)로 인한 낮은 정확도와 성능이다.

하지만 SIMD 연산을 수행하는 인텔 AVX 명령어와 Math.fma() 메서드를 지원하는 JDK 9가 등장하면서 계산 성능이 업그레이드됐다. Math.fma()를 사용하면 가장 가까운 짝수로 반올림하는 모드를 사용해 반올림을 한 번만 수행한다.

double fma = Math.fma(x, y, z);

이와 같은 개선은 최신 인텔 프로세서에서 가능하므로 JDK 9만으로는 부족하다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.