곱셈누적연산

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). GCCClang C 컴파일러는 기본적으로 FMA 명령어를 지원하는 프로세서 아키텍처를 위해 이러한 변환을 수행합니다. 앞서 언급한 프래그마를 지원하지 않는 GCC의 경우,[12] 이것은 세계적으로 제어될 수 있습니다. -ffp-contract 명령줄 옵션.[13]

fused multi-add 연산은 IBM POWER1(1990) 프로세서에서 "multi-add fused"로 소개되었지만,[14] 그 이후로 수많은 다른 프로세서에 추가되었습니다.

참고 항목

참고문헌

  1. ^ "The Feasibility of Ludgate's Analytical Machine". Archived from the original on 2019-08-07. Retrieved 2020-08-30.
  2. ^ 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.
  3. ^ 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.
  4. ^ 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.
  5. ^ "mad - ps". Retrieved 2021-08-14.
  6. ^ Whitehead, Nathan; Fit-Florea, Alex (2011). "Precision & Performance: Floating Point and IEEE 754 Compliance for NVIDIA GPUs" (PDF). nvidia. Retrieved 2013-08-31.
  7. ^ "fmadd instrs". IBM.
  8. ^ Kahan, William (1996-05-31). "IEEE Standard 754 for Binary Floating-Point Arithmetic".
  9. ^ Quinnell, Eric (May 2007). Floating-Point Fused Multiply–Add Architectures (PDF) (PhD thesis). Retrieved 2011-03-28.
  10. ^ 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.
  11. ^ "VAX instruction of the week: POLY". Archived from the original on 2020-02-13.
  12. ^ "Bug 20785 - Pragma STDC * (C99 FP) unimplemented". gcc.gnu.org. Retrieved 2022-02-02.
  13. ^ "Optimize Options (Using the GNU Compiler Collection (GCC))". gcc.gnu.org. Retrieved 2022-02-02.
  14. ^ 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.closed access
  15. ^ "Godson-3 Emulates x86: New MIPS-Compatible Chinese Processor Has Extensions for x86 Translation".
  16. ^ Hollingsworth, Brent (October 2012). "New "Bulldozer" and "Piledriver" Instructions". AMD Developer Central.
  17. ^ "Intel adds 22nm octo-core 'Haswell' to CPU design roadmap". The Register. Archived from the original on 2012-02-17. Retrieved 2008-08-19.