吾人本身一陣最常用到的二個運算: Sqrt, 1/Sqrt,於是會找些奇淫怪技想辦法加速。

事實上在做 Sqrt 加速時,實測之結果效能都沒 VC 開 O2 來得快,即使只求整數之 sqrt 之演算法效果也沒很好,所幸在 codeproject 看到有人已實測,該程式碼共寫了 14 份 sqrt,有興趣可去下載下來看看,其中 asm 崁入的有 2 份,測出來結果都比內建的還快,且精度也完全正確。以下為該作者提供之 2 份 sqrt,實測出來約比內建 sqrt 快上 20% 左右 (11390 : 8922),其它的 12 種方法若有興趣,也可再進行實測。

double inline __declspec (naked) __fastcall sqrt14(double n)
{
    _asm fld qword ptr [esp+4]
    _asm fsqrt
    _asm ret 8
}

double sqrt13(double n)
{
    __asm{
       fld n
       fsqrt
    }
}

 

經由 sqrt、log2、invSqrt 等文之探討,若效能要寫過 vc 提供之 library (除整數次方除外),真的不容易,若不會寫 asm 、對速度沒特別需求的話,還是直接用 vc 內建提供之 math library 即可,不然可能三不五時又要看到 0x5f3759df 這種 magic number。

若要看其它 asm 碼,可至此網站,裡面提供大多是整數型之 sqrt,比 vc 內建之 sqrt 還快的約有一半 (後半段)。

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()