단일 곱셈-누산기
1. 개요
단일 곱셈-누산기(FMA, fused multiply-add)는 부동 소수점 곱셈과 덧셈 연산을 한 번의 반올림으로 수행하는 연산이다. IEEE 754-2008 표준에서 권장하며, 곱셈과 덧셈을 개별적으로 수행하는 것보다 더 정확한 결과를 제공한다. FMA는 내적, 행렬 곱셈, 다항식 평가 등 다양한 계산에 활용되며, CPU, GPU, DSP 등 다양한 하드웨어에서 지원된다. C 프로그래밍 언어는 fma() 함수를 통해 FMA 연산을 지원한다.
| 종류 | 곱셈-누산 |
|---|---|
| 분야 | 디지털 신호 처리 |
| 약칭 | MAC |
| 활용 | 디지털 필터링 신경망 푸리에 변환 내적 계산 |
| 수식 | a ← a + (b × c) |
|---|---|
| 설명 | '곱셈 결과(b × c)를 누산기 변수 a에 더하여 갱신하는 연산이다.' |
| 정확도 향상 | 중간 계산 결과의 정밀도를 유지하여 최종 결과의 정확도를 높임. |
|---|---|
| 성능 향상 | 곱셈과 덧셈을 하나의 단계로 결합하여 처리 속도를 향상시킴. |
| FMA (Fused Multiply-Add) | 일부 프로세서에서 지원하는 기능으로, 반올림 오차를 줄여 더 정확한 결과를 얻을 수 있다. |
| 응용 분야 | 디지털 신호 처리 (DSP) 그래픽 처리 (GPU) 머신 러닝 (신경망) |
| 곱셈-누산 장치 (MAC 유닛) | 곱셈과 덧셈을 동시에 수행하는 전용 하드웨어 회로. |
|---|---|
| 구성 요소 | 곱셈기 덧셈기 누산기 (결과 저장) |
| 성능 지표 | 처리량, 지연 시간, 전력 소비량 |
| 설명 | 곱셈과 덧셈을 단일 연산으로 결합하여 중간 반올림 없이 최종 결과를 얻는 방식. |
|---|---|
| 장점 | 높은 정확도 빠른 연산 속도 향상된 성능 |
-
디지털 신호 처리 -
라플라스 변환
라플라스 변환은 함수 f(t)를 복소수 s를 사용하여 적분을 통해 다른 함수 F(s)로 변환하는 적분 변환이며, 선형성을 가지고 미분방정식 풀이 등 공학 분야에서 널리 사용된다. -
디지털 신호 처리 -
디랙 델타 함수
디랙 델타 함수는 원점에서 무한대 값을 갖고 그 외 지점에서 0의 값을 갖는 수학적 개념으로, 분포 또는 측도로 정의되며, 순간적인 충격이나 점 형태 현상 모델링에 활용되고 푸리에 변환, 스케일링, 평행 이동 등의 성질을 가진다. -
컴퓨터 산술 -
IEEE 754
IEEE 754는 부동소수점 숫자를 표현하고 처리하기 위한 국제 표준으로, 다양한 형식과 연산, 반올림 규칙, 예외 처리 등을 정의한다. -
컴퓨터 산술 -
1의 보수
1의 보수는 이진수에서 양수는 일반적인 이진수로, 음수는 양수의 각 비트를 반전시켜 표현하며, 덧셈 시 자리올림수가 발생하면 결과값에 더해야 하고, 0을 중복 표현하는 단점으로 현대에는 2의 보수가 주로 사용된다.
2. 부동소수점 연산과 FMA
부동 소수점 연산은 수학적 정밀도가 제한되어 있어, 일반적인 곱셈과 덧셈 연산을 각각 수행하면 반올림을 두 번 거치게 되고, 이로 인해 오차가 발생할 수 있다. IEEE 754-2008 표준에서는 이러한 오차를 줄이기 위해 융합 곱셈-덧셈 (Fused Multiply-Add, FMA) 연산을 도입했다. FMA는 곱셈과 덧셈을 하나의 단계로 결합하여 한 번의 반올림만 수행하므로, 더 정확한 결과를 얻을 수 있다.
2.1. FMA 연산의 정의
융합 곱셈-덧셈(FMA 또는 fmadd)은 부동 소수점 곱셈-덧셈 연산을 한 번의 반올림만으로 수행하는 것이다. 즉, 일반적인 곱셈-덧셈 연산이 를 계산하고 결과를 N개의 유효 비트로 반올림한 다음, 에 더하고 다시 N개의 유효 비트로 반올림하는 반면, FMA는 전체 식 를 최종 결과를 N개의 유효 비트로 반올림하기 전에 전체 정밀도로 계산한다.
FMA 연산은 IEEE 754 규격의 2008년 개정판(IEEE 754-2008)에서 표준화되었다. FMA 명령어는 CPU에서는 HP의 PA-RISC, IBM의 메인프레임 컴퓨터 3090의 VF 확장, IBM의 Power 프로세서, 인텔의 Itanium 프로세서, 인텔 x86계 프로세서의 FMA 명령어 세트, ARM의 확장 명령어인 VFPv4와 NEONv2에서 구현되어 있다. 또한, CPU나 DSP뿐만 아니라 GPU(NVIDIA제, AMD제, 인텔제 등)에서도 지원된다.
곱셈-덧셈 연산을 두 번의 반올림 대신 FMA를 사용하여 한 번의 반올림으로 수행하면 더 정확한 결과를 얻을 수 있다. 중간 곱셈 의 결과를 부동 소수점 수 값으로 반올림하지 않고 연산을 1 명령어로 수행함으로써 최종 결과의 오차를 줄일 수 있다.
2.2. FMA의 장점
FMA는 다음과 같은 여러 계산에서 속도와 정확도를 향상시킬 수 있다.
* 내적
* 행렬 곱셈
* 다항식 평가 (예: 호너의 방법 사용)
* 함수 평가를 위한 뉴턴 방법 (역함수에서)
* 컨볼루션 및 인공 신경망
* double-double 산술에서의 곱셈
융합 곱셈-덧셈(FMA)은 일반적으로 더 정확한 결과를 제공한다. 그러나 윌리엄 카한은 FMA를 무심코 사용하면 문제가 발생할 수 있다고 지적했다.
FMA 명령어를 사용하면 나눗셈 (나눗셈 알고리즘 참조) 및 제곱근 (제곱근 계산 방법 참조) 연산의 효율적인 소프트웨어 구현을 가능하게 하여, 이러한 연산에 필요한 전용 하드웨어를 줄일 수 있다.
2.3. FMA 사용 시 주의점
윌리엄 카한은 융합 곱셈-덧셈(FMA)을 무심코 사용하면 문제가 발생할 수 있다고 지적했다. x영어2 - y영어2가 ((x × x) - y × y)로 계산되는 경우 (중복 괄호가 컴파일러에게 먼저 (x × x) 항을 반올림하도록 지시하는 카한의 제안된 표기법을 따름) FMA를 사용하면, 첫 번째 곱셈이 낮은 유효 비트를 버리기 때문에 x영어 = y영어일 때조차 결과가 음수가 될 수 있다. 예를 들어 결과의 제곱근을 계산하는 경우 오류가 발생할 수 있다.
3. FMA 지원 하드웨어 및 소프트웨어
FMA 연산은 IEEE 754-2008 표준에 포함되어 있다.
IBM POWER1 (1990) 프로세서에서 "곱셈-덧셈 융합"으로 처음 도입되었으며, 그 이후 많은 다른 프로세서에 추가되었다. 또한, 1999년 표준 C 프로그래밍 언어는 `fma()` 표준 수학 라이브러리 함수와 곱셈에 이은 덧셈의 자동 변환(부동 소수점 표현식 축약)을 통해 FMA 연산을 지원한다.
3.1. FMA를 지원하는 프로세서
IBM POWER1 (1990) 프로세서에서 "곱셈-덧셈 융합"으로 처음 도입되었다. 이후 다양한 프로세서에서 FMA를 지원한다.
| 제조사 | 제품명 | 연도 |
|---|---|---|
| HP | PA-8000 | 1996 |
| 히타치 | SuperH SH-4 | 1998 |
| SCE-Toshiba | Emotion Engine | 1999 |
| 인텔 | Itanium | 2001 |
| STI | Cell | 2006 |
| Fujitsu | SPARC64 VI | 2007 |
| (MIPS 호환) | Loongson-2F | 2008 |
| Elbrus-8SV | 2018 | |
| AMD | Bulldozer (FMA4만) | 2011 |
| AMD | Piledriver (FMA3 및 FMA4) | 2012 |
| AMD | Steamroller | 2014 |
| AMD | Excavator | 2015 |
| AMD | Zen (FMA3만) | 2017 |
| 인텔 | Haswell (FMA3만) | 2013 |
| 인텔 | Skylake (FMA3만) | 2015 |
| ARM 프로세서 | ARM Cortex-M4F | 2010 |
| STM32 Cortex-M33 (VFMA 연산) | ||
| ARM | ARM Cortex-A5 | 2012 |
| ARM | ARM Cortex-A7 | 2013 |
| ARM | ARM Cortex-A15 | 2012 |
| 퀄컴 | Krait | 2012 |
| 애플 | Apple A6 | 2012 |
| ARMv8 | 모든 프로세서 | |
| Fujitsu | A64FX ("접두사 명령어를 사용한 4-피연산자 FMA") | |
| IBM | z/Architecture | 1998년 이후 |
| AMD GPU | TeraScale 2 "Evergreen"-시리즈 기반, Graphics Core Next 기반 | 2009 |
| Nvidia GPU | Fermi 기반, Kepler 기반, Maxwell 기반, Pascal 기반, Volta 기반 | 2010 |
| 인텔 | Sandy Bridge 이후 GPU | |
| 인텔 | 인텔 MIC | 2012 |
| ARM Mali | T600 시리즈 이상 | 2012 |
| NEC | SX-Aurora TSUBASA | |
| RISC-V 명령어 집합 | 2010 |
3.2. FMA를 지원하는 프로그래밍 언어
1999 표준의 C 프로그래밍 언어는 `fma()` 표준 수학 라이브러리 함수와 곱셈에 이은 덧셈의 자동 변환(부동 소수점 표현식 축약)을 통해 FMA 연산을 지원하며, 이는 표준 프라그마를 사용하여 명시적으로 활성화하거나 비활성화할 수 있다. GCC 및 Clang C 컴파일러는 FMA 명령어를 지원하는 프로세서 아키텍처에 대해 기본적으로 이러한 변환을 수행한다. GCC는 앞서 언급한 프라그마를 지원하지 않으므로, -ffp-contract 명령줄 옵션을 통해 전역적으로 제어할 수 있다.
4. 추가 정보
(내용 없음)