乘积累加运算(Multiply Accumulate, MAC)
轉(zhuǎn)自:https://www.mobibrw.com/2019/17864
乘積累加運(yùn)算(英語(yǔ):Multiply?Accumulate,?MAC)是在數(shù)字信號(hào)處理器或一些微處理器中的特殊運(yùn)算。實(shí)現(xiàn)此運(yùn)算操作的硬件電路單元,被稱(chēng)為“乘數(shù)累加器”。這種運(yùn)算的操作,是將乘法的乘積結(jié)果和累加器?A 的值相加,再存入累加器:
若沒(méi)有使用 MAC 指令,上述的程序可能需要二個(gè)指令,但 MAC 指令可以使用一個(gè)指令完成。而許多運(yùn)算(例如卷積運(yùn)算、點(diǎn)積運(yùn)算、矩陣運(yùn)算、數(shù)字濾波器運(yùn)算、乃至多項(xiàng)式的求值運(yùn)算)都可以分解為數(shù)個(gè) MAC 指令,因此可以提高上述運(yùn)算的效率。
MAC指令的輸入及輸出的數(shù)據(jù)類(lèi)型可以是整數(shù)、定點(diǎn)數(shù)或是浮點(diǎn)數(shù)。若處理浮點(diǎn)數(shù)時(shí),會(huì)有兩次的數(shù)值修約(Rounding),這在很多典型的DSP上很常見(jiàn)。若一條MAC指令在處理浮點(diǎn)數(shù)時(shí)只有一次的數(shù)值修約,則這種指令稱(chēng)為“融合乘加運(yùn)算”/“積和熔加運(yùn)算”(fused multiply-add, FMA)或“熔合乘法累積運(yùn)算”(fused multiply–accumulate, FMAC)。
積和熔加運(yùn)算
融合乘加運(yùn)算的操作和乘積累加的基本一樣,對(duì)于浮點(diǎn)數(shù)的操作也是一條指令完成。但不同的是,非融合乘加的乘積累加運(yùn)算,處理浮點(diǎn)數(shù)時(shí),會(huì)先完成b×c的乘積,將其結(jié)果數(shù)值修約到N個(gè)比特,然后才將修約后的結(jié)果與寄存器a的數(shù)值相加,再把結(jié)果修約到N個(gè)比特;融合乘加則是先完成a+b×c的操作,獲得最終的完整結(jié)果后方才修約到N個(gè)比特。由于減少了數(shù)值修約次數(shù),這種操作可以提高運(yùn)算結(jié)果的精度,以及提高運(yùn)算效率和速率。
積和融加運(yùn)算可以顯著提升像是這些運(yùn)算的性能和精度:
- 點(diǎn)積
- 矩陣乘法
- 多項(xiàng)式方程求解(像是秦九韶算法等)
- 牛頓法求解函數(shù)的零點(diǎn)
積和融加運(yùn)算通常被依靠用來(lái)獲取更精確的運(yùn)算結(jié)果。然而,Kahan指出,如果不加思索地使用這種運(yùn)算操作,在某些情況下可能會(huì)帶來(lái)問(wèn)題。[1]像是平方差公式x2???y2,它等價(jià)于?((x×x) ??y×y),若果x與y已知數(shù)值,使用積和融加運(yùn)算來(lái)求結(jié)果,哪怕x?=?y時(shí),因?yàn)樵谶M(jìn)行首次乘法操作時(shí)無(wú)視低位的有效比特,可能會(huì)使運(yùn)算結(jié)果出錯(cuò),如果是多步運(yùn)算,第一步就出錯(cuò)則會(huì)連累后續(xù)的運(yùn)算結(jié)果接連出錯(cuò),比如前述的平方差求值后,再取結(jié)果的平方根,那么這個(gè)結(jié)果也會(huì)出錯(cuò)。
參考鏈接
- ^?W.Kahan.?IEEE Standard 754 for Binary Floating-Point Arithmetic. May 31, 1996.
- 乘積累加運(yùn)算
總結(jié)
以上是生活随笔為你收集整理的乘积累加运算(Multiply Accumulate, MAC)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Microsoft Teams的Meet
- 下一篇: [教程] 中断闪存或备份后如何修复 MT