簡體   English   中英

卡漢求和

[英]Kahan summation

有人在應用程序中使用過 Kahan 求和嗎? 額外的精度什么時候有用?

我聽說在某些平台上,雙重操作比浮動操作更快。 我怎樣才能在我的機器上測試這個?

當您對數字求和並且需要最小化最壞情況的浮點錯誤時, Kahan 求和效果很好。 如果沒有這種技術,如果您有兩個數的大小相差可用有效數字(例如 1 + 1e-12),則加法運算的精度可能會顯着降低。 Kahan 求和補償了這一點。

這里有一個關於浮點問題的極好的資源,“每個計算機科學家都應該知道的浮點運算知識”: http ://www.validlab.com/goldberg/paper.pdf

關於單精度與雙精度性能:是的,單精度可以明顯更快,但這取決於特定的機器。 請參閱: https ://www.hpcwire.com/2006/06/16/less_is_more_exploiting_single_precision_math_in_hpc-1/

最好的測試方法是編寫一個簡短的示例來測試您關心的操作,同時使用單精度(浮點)和雙精度,並測量運行時間。

我使用 Kahan 求和進行蒙特卡洛積分。 您有一個標量值函數f ,您認為它的計算成本相當高; 一個合理的估計是 65ns/維度。 然后將這些值累加到平均值中——更新平均值大約需要 4ns。 因此,如果您使用 Kahan 求和(4 倍的觸發器,~16ns)更新平均值,那么您實際上並沒有向總數添加那么多計算。 , but this is incorrect.現在常說蒙特卡洛積分的誤差為σ/√ ,其實這是不正確的。 實際誤差界限(在有限精度算術中)是

+ cond( )ε N σ/√ + cond( )ε N

) is the condition number of summation and ε is twice the unit roundoff.其中 cond( ) 是求和的條件數,ε 是單位舍入的兩倍。 所以算法發散收斂快。 對於 32 位算術,獲得 ε N ~ 1 很簡單:可以非常快速地完成 10^7 次評估,之后您的蒙特卡洛積分將進行隨機游走。 當條件數很大時,情況更糟。

如果使用 Kahan 求和,則錯誤的表達式變為

+ cond( 2 N, σ/√ + cond( 2 N,

誠然,它的發散速度仍然快於收斂速度,但 ε 2 N 在現代硬件上無法在合理的時間尺度上變大。

在計算運行平均值時,我使用 Kahan 求和來補償累積誤差。 它確實有很大的不同,而且很容易測試。 僅經過 100 次求和,我就消除了相當大的錯誤。

我肯定會使用 Kahan 求和算法來補償任何運行總計中的錯誤。

但是,我注意到在進行逆矩陣乘法時出現了相當大的 ( 1e-3 ) 錯誤。 基本上, A*x = y ,然后是inv(A)*y ~= x我沒有准確地恢復原始值。 這很好,但我認為 Kahan 求和可能會有所幫助(有很多加法),尤其是對於 >3×3 的較大矩陣。 我嘗試使用 4×4 矩陣,但它根本沒有改善這種情況。

額外的精度什么時候有用?

非常粗略:

情況1

當你在

  • 總結了很多數據
  • 以非順序方式,即計算總和,然后對總和求和(而不是用運行總和迭代所有數據),

然后 Kahan 求和在第二階段很有意義——當你求和時,因為你避免的錯誤現在更重要,而開銷只支付總和的一小部分操作。

案例二

當您使用精度較低的浮點類型時,不確定是否滿足精度要求,並且不允許切換到更大、精度更高的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM