2010-08-28 71 views
13

fma(a,b,c)相當於a*b+c,除了它不輪迴中間結果。哪些算法從融合乘法增益中獲益最多?

你可以給我一些算法的例子,避免這種舍入的非平凡獲益嗎?

這並不明顯,因爲我們避免的乘法之後的四捨五入比加法之後的四捨五入更不那麼成問題。

回答

5

taw打到一個重要的例子;更一般地說,FMA允許庫編寫者通過正確舍入來高效地實現許多其他浮點操作。例如,具有FMA的平臺可以使用它來實現正確舍入的除法和平方根(PPC和Itanium採用此方法),這使得FPU基本上是單用途FMA機器。如果您好奇,Peter Tang和John Harrison(Intel)以及Peter Markstein(HP)有一些文章解釋了這種用法。

該示例taw給出比跟蹤誤差範圍更廣泛的用處。它允許您將兩個浮點數的乘積表示爲兩個浮點數的總和,而沒有任何舍入誤差;這在實現正確舍入的浮點庫函數中非常有用。 Jean-Michel Muller的書或crlibm上的論文將是瞭解更多關於這些用途的好地方。

FMA在減少某些參數類型的數學庫風格例程中的參數方面也有廣泛的用處;當一個人正在進行參數縮減時,計算的目標往往是(x - a*b)形式的術語,其中(a*b)幾乎等於x本身;尤其是,結果通常是在(a*b)術語中舍入誤差的順序,如果這是在沒有FMA的情況下計算的。我相信穆勒在他的書中也寫了一些這方面的內容。

1

關閉我的頭頂 - 矩陣乘法,牛頓的法則,多項式評價,數值方法

2

FMA的主要好處是,它可以快一倍。而不是採取1個週期的乘法,然後1個週期的加法,FPU可以在同一個週期內發出兩個操作。顯然,大多數算法將受益於更快的操作。

+2

問題是關於四捨五入的影響,不是這個。你的回答也是不正確的,因爲fma需要3個輸入浮點單元,而不是標準的2個輸入,浮點寄存器文件中的額外端口以及更寬的浮點加法器。這不是免費的,這是對fma支持的折衷,其他硬件。 – taw 2010-08-28 13:26:35

+0

taw:您問過哪些算法可以從FMA中受益,以及哪些算法可以使舍入成爲非平凡的好處。我回答了第一部分,這是大多數算法將受益。 – Gabe 2010-08-28 16:17:37

2

一些例子:矢量點產品。傅立葉變換。數字信號處理。多項式。各種各樣的東西。

這是一個優化和硬件開發更多的問題。產品總和是數值方法中的一個非常普遍的要求,這種方式可以讓您向編譯器提供一個明確的指示,告訴他們如何快速完成某個任務,並且可能精度更高一些。除非我錯了,編譯器可以用FMA指令自由地替換a = b * c + d,但它也是免費的。 (除非標準要求四捨五入,但現實世界的編譯器經常以小的方式違反標準)。

+1

編譯器無法合法地用FMA代替b * c + d,除非您明確地告訴編譯器它可以(使用-ffast-math或類似的東西),因爲它會擾亂結果。 – 2013-08-14 17:11:37

+0

@StephenLin:假設'b','c'和'd'的評估不會改變狀態或產生其他副作用,那麼硬件優化如何「擾動結果」呢? – stakx 2014-07-16 06:29:51

+0

@stakx:浮點指令集中的許多複合指令都存在,因爲舍入錯誤會導致結果淹沒。例如:如果您採用e ^(接近零),結果接近1,但這大大限制了您的精確度。如果你有一個代表e^epsilon-1的指令,那麼硬件可以提供更高的精度。任何給定的高級語言都可以定義爲提供訪問更精確的指令或在可識別的情況下重寫表達式樹。前者更可預測。 – Ian 2014-07-23 04:57:13

4

到目前爲止,我發現的唯一一件事是「無差錯轉換」。對於任何來自a+ba-ba*b的浮點數錯誤也都是浮點數(假設沒有上溢/下溢等等),則循環到最近的模式。

加法(明顯減法)誤差很容易計算;如果abs(a) >= abs(b),則錯誤確切地爲b-((a+b)-a)(2個觸發器,或者如果我們不知道哪個更大,則爲4-5)。乘法誤差很容易用fma來計算 - 它僅僅是fma(a,b,-a*b)。如果沒有fma,它的代碼非常糟糕。正確舍入的完全通用仿真fma甚至比這慢。

實際計算的每次翻牌的額外16次觸發錯誤是一個巨大的矯枉過正,但只有1-5管道友好的觸發器是非常合理的,對於許多基於50%-200%誤差跟蹤開銷的算法並且補償導致誤差小到如果所有計算都是以它們的位數的兩倍完成的,則在許多情況下避免了不適應。

有趣的是,fma沒有遇上這些算法用於計算結果,只是發現錯誤,因爲找到的fma錯誤是慢如發現乘法的錯誤是沒有fma

搜索相關的關鍵詞將是「補償霍納計劃」和「補償點產品」,霍納計劃受益更多。

+0

我想知道FMA在'float'值上的硬件成本是如何與一個操作的硬件成本進行比較的,該操作將兩個'float'值的全精度乘積添加到'double'中。根據我的理解,「雙倍」乘法的成本硬件是同等快速「乘法」乘法產生的全精度結果的四倍以上,對於像點積這樣的許多操作,必須更多地維護中間值精度比操作數或最終結果。一起使用multiply和fma可能會起作用,但使用f * f + d操作看起來要快兩倍。 – supercat 2015-05-11 23:15:46

1

它對Wikipedia entry for FMA已經相當不錯解釋說,這有什麼做積累的產品大部分使用FMA受益的算法:

A fast FMA can speed up and improve the accuracy of 
many computations that involve the accumulation of products: 

* Dot product 
* Matrix multiplication 
* Polynomial evaluation (e.g., with Horner's rule) 
* Newton's method for evaluating functions.