곱셈누적연산
Multiply–accumulate operation컴퓨팅, 특히 디지털 신호 처리에서 MAC(Multiply-Acculate) 또는 MAD(Multiply-Add) 연산은 두 숫자의 곱을 계산하고 그 곱을 누산기에 추가하는 일반적인 단계입니다. 연산을 수행하는 하드웨어 장치는 MAC 유닛(Multiplier-Accumulator)으로 알려져 있으며, 연산 자체를 MAC 또는 MAD 연산이라고도 합니다. MAC 작업은 누산기 a를 수정합니다.
부동 소수점 번호를 사용할 경우 두 개의 반올림(많은 DSP에서 일반적)으로 수행하거나 단일 반올림으로 수행할 수 있습니다. 한 번의 반올림으로 수행할 경우 FMA(Fused Multi-Add) 또는 FMA(Fused Multi-Acculate)라고 합니다.
현대 컴퓨터는 조합 논리로 구현된 곱셈기와 결과를 저장하는 누적기 레지스터로 구성된 전용 MAC을 포함할 수 있습니다. 레지스터의 출력은 가산기의 한 입력으로 피드백되어 각 클럭 사이클에서 승수의 출력이 레지스터에 추가됩니다. 조합 승수는 많은 양의 논리를 필요로 하지만 이전 컴퓨터의 전형적인 이동 및 추가 방법보다 훨씬 더 빠르게 제품을 계산할 수 있습니다. 퍼시 러드게이트는 1909년 그의 분석 기계에서 최초로 MAC을 고안했고,[1] (1+x) 수렴 급수를 통해 역수로 시드된 곱셈을 사용하여) 분할을 위해 MAC을 이용한 최초의 사람이었습니다.−1 최초로 MAC 유닛을 탑재한 현대 프로세서는 디지털 신호 프로세서였지만, 현재는 범용 프로세서에서도 이 기술이 일반화되어 있습니다.[2][3][4][5]
부동소수점 산술에서
정수를 사용하면 일반적으로 연산이 정확합니다(계산된 모듈로 2의 일부 거듭제곱). 그러나 부동소수점 숫자는 어느 정도의 수학적 정밀도만을 가지고 있습니다. 즉, 디지털 부동 소수점 산술은 일반적으로 연관되거나 분배되지 않습니다. (플로팅 포인트 § 정확도 문제 참조). 따라서 곱셈 덧셈이 두 번의 반올림으로 수행되는지, 아니면 한 번의 반올림으로 수행되는지(융합 곱셈 덧셈) 결과에 차이가 있습니다. IEEE 754-2008은 한 번의 반올림으로 수행해야 함을 명시하여 보다 정확한 결과를 산출합니다.[6]
Fused 곱하기 - 덧셈
FMA(Fused Multi-Add) 또는 fmadd([7]fused multi-add)는 단일 반올림으로 한 단계(Fused operation)에서 수행되는 부동 소수점 곱셈 연산입니다. 즉, 융합되지 않은 곱셈 덧셈이 곱셈 b × c를 계산하고, 그것을 N개의 유효 비트로 반올림하고, 결과를 a에 더하고, 다시 N개의 유효 비트로 반올림하는 경우, 융합된 곱셈 덧셈은 최종 결과를 N개의 유효 비트로 반올림하기 전에 전체 표현식 a + (b × c)를 최대 정밀도로 계산합니다.
빠른 FMA는 제품 축적과 관련된 많은 계산의 정확도를 향상시키고 속도를 높일 수 있습니다.
융합 곱하기 덧셈은 일반적으로 더 정확한 결과를 제공하기 위해 의존할 수 있습니다. 하지만 윌리엄 카한은 생각 없이 사용하면 문제를 일으킬 수 있다고 지적했습니다.[8] x - y를 (x × x - y × y)로 평가하면(중복 괄호가 fused multi-add를 사용하여 컴파일러가 먼저 (x × x) 항을 반올림하도록 지시하는 following Kahan의 제안된 표기법), 첫 번째 곱셈이 낮은 유의성 비트를 폐기하기 때문에 x = y에서도 결과가 음수일 수 있습니다. 예를 들어, 결과의 제곱근을 평가하면 오류가 발생할 수 있습니다.
마이크로프로세서 내부에 구현될 때, FMA는 곱셈 연산 후에 추가되는 것보다 더 빠를 수 있습니다. 그러나 원래 IBM RS/6000 설계를 기반으로 한 표준 산업 구현에서는 합계를 제대로 계산하려면 2N 비트 가산기가 필요합니다.[9]
이 지침을 포함하는 것의 또 다른 이점은 분할(분할 알고리즘 참조) 및 제곱근(제곱근 계산 방법 참조) 작업의 효율적인 소프트웨어 구현을 가능하게 하여 이러한 작업을 위한 전용 하드웨어가 필요하지 않다는 것입니다.[10]
도트제품설명서
두 개의 128비트 SIMD 레지스터에서 4요소 도트 곱을 수행하는 것과 같이 여러 개의 융합 곱셈 연산을 하나의 단계로 결합하는 기계도 있습니다. a0×b0 + a1×b1 + a2×b2 + a3×b3
단일 사이클 처리량으로 제공됩니다.
지지하다
FMA 작업은 IEEE 754-2008에 포함되어 있습니다.
DEC(Digital Equipment Corporation) VAX의 기능 POLY
명령어는 곱하기와 더하기 단계의 연속을 사용하여 호너의 규칙으로 다항식을 평가하는 데 사용됩니다. 명령 설명에는 곱셈 및 덧셈이 단일 FMA 단계를 사용하여 수행되는지 여부가 명시되어 있지 않습니다.[11] 이 지침은 1977년 11/780의 원래 구현 이후 VAX 지침 세트의 일부입니다.
1999년 C 프로그래밍 언어 표준은 다음을 통해 FMA 동작을 지원합니다. fma()
표준 수학 라이브러리 함수와 곱셈의 자동 변환 후에 추가(부동점 표현식의 축소), 표준 프래그마로 명시적으로 활성화하거나 비활성화할 수 있습니다.#pragma STDC FP_CONTRACT
). GCC와 Clang C 컴파일러는 기본적으로 FMA 명령어를 지원하는 프로세서 아키텍처를 위해 이러한 변환을 수행합니다. 앞서 언급한 프래그마를 지원하지 않는 GCC의 경우,[12] 이것은 세계적으로 제어될 수 있습니다. -ffp-contract
명령줄 옵션.[13]
fused multi-add 연산은 IBM POWER1(1990) 프로세서에서 "multi-add fused"로 소개되었지만,[14] 그 이후로 수많은 다른 프로세서에 추가되었습니다.
- HPPA-8000(1996) 이상
- 히타치 슈퍼HSH-4 (1998)
- SCE-Toshiba Emotion Engine (1999)
- 인텔 아이테니엄 (2001)
- STI Cell (2006)
- 후지쯔 SPARC64 VI (2007) 이상
- (MIPS 호환) 용손-2F (2008)[15]
- Elbrus-8SV (2018)
- FMA3 및/또는 FMA4 명령어 세트가 있는 x86 프로세서
- VFPv4 및/또는 NEONv2가 포함된 ARM 프로세서:
- ARM 코텍스-M4F (2010)
- STM32 코텍스-M33 (VFMA 작동)
- ARM 코텍스-A5 (2012)
- ARM 코텍스-A7 (2013)
- ARM 코텍스-A15 (2012)
- Qualcomm Krait (2012)
- 애플 A6 (2012)
- 모든 ARMv8 프로세서
- Fujitsu A64FX는 "Four-operand FMA with Prefix 명령"을 가지고 있습니다.
- IBM z/Architecture (1998년 이후)
- GPU 및 GPGPU 보드:
- AMD GPU(2009) 이상
- 테라스케일 2 "Evergreen" 시리즈 기반
- 그래픽 코어 넥스트 기반
- Nvidia GPU(2010) 이상
- Sandy Bridge 이후의 Intel GPU
- 인텔 MIC (2012)
- ARM 말리 T600 시리즈 (2012) 이상
- AMD GPU(2009) 이상
- 벡터 프로세서:
- RISC-V 명령어 세트 (2010)
참고 항목
참고문헌
- ^ "The Feasibility of Ludgate's Analytical Machine". Archived from the original on 2019-08-07. Retrieved 2020-08-30.
- ^ Lyakhov, Pavel; Valueva, Maria; Valuev, Georgii; Nagornov, Nikolai (January 2020). "A Method of Increasing Digital Filter Performance Based on Truncated Multiply-Accumulate Units". Applied Sciences. 10 (24): 9052. doi:10.3390/app10249052.
- ^ Tung Thanh Hoang; Sjalander, M.; Larsson-Edefors, P. (May 2009). "Double Throughput Multiply-Accumulate unit for FlexCore processor enhancements". 2009 IEEE International Symposium on Parallel & Distributed Processing. pp. 1–7. doi:10.1109/IPDPS.2009.5161212. ISBN 978-1-4244-3751-1. S2CID 14535090.
- ^ Kang, Jongsung; Kim, Taewhan (2020-03-01). "PV-MAC: Multiply-and-accumulate unit structure exploiting precision variability in on-device convolutional neural networks". Integration. 71: 76–85. doi:10.1016/j.vlsi.2019.11.003. ISSN 0167-9260. S2CID 211264132.
- ^ "mad - ps". Retrieved 2021-08-14.
- ^ Whitehead, Nathan; Fit-Florea, Alex (2011). "Precision & Performance: Floating Point and IEEE 754 Compliance for NVIDIA GPUs" (PDF). nvidia. Retrieved 2013-08-31.
- ^ "fmadd instrs". IBM.
- ^ Kahan, William (1996-05-31). "IEEE Standard 754 for Binary Floating-Point Arithmetic".
- ^ Quinnell, Eric (May 2007). Floating-Point Fused Multiply–Add Architectures (PDF) (PhD thesis). Retrieved 2011-03-28.
- ^ Markstein, Peter (November 2004). Software Division and Square Root Using Goldschmidt's Algorithms (PDF). 6th Conference on Real Numbers and Computers. CiteSeerX 10.1.1.85.9648.
- ^ "VAX instruction of the week: POLY". Archived from the original on 2020-02-13.
- ^ "Bug 20785 - Pragma STDC * (C99 FP) unimplemented". gcc.gnu.org. Retrieved 2022-02-02.
- ^ "Optimize Options (Using the GNU Compiler Collection (GCC))". gcc.gnu.org. Retrieved 2022-02-02.
- ^ Montoye, R. K.; Hokenek, E.; Runyon, S. L. (January 1990). "Design of the IBM RISC System/6000 floating-point execution unit". IBM Journal of Research and Development. 34 (1): 59–70. doi:10.1147/rd.341.0059.
- ^ "Godson-3 Emulates x86: New MIPS-Compatible Chinese Processor Has Extensions for x86 Translation".
- ^ Hollingsworth, Brent (October 2012). "New "Bulldozer" and "Piledriver" Instructions". AMD Developer Central.
- ^ "Intel adds 22nm octo-core 'Haswell' to CPU design roadmap". The Register. Archived from the original on 2012-02-17. Retrieved 2008-08-19.