看到「rr Trace Portability: Diverging Behavior of RSQRTSS in AMD vs Intel」這個,作者因為在 rr 上發現 replay 不正確,發現是 SSE 裡面的 RSQRTSS
這個指令在 Intel 與 AMD 平台上會有不同的值出現導致的。
RSQRTSS
是計算平方根倒數,也就是計算 ,另外比較特別的是,這個指令不保證正確性,是允許有誤差產生的。
提到平方根倒數,這個演算法更有名的應該是「反平方根快速演算法」這個用到 0x5f3759df
這個魔術數字的奇技淫巧,不過這不是這次的重點...
作者發現 RSQRTSS
在 Intel 與 AMD 平台的值不一定一樣,像是 256 的平方根導數是 1/16 (0.0625),但兩個平台跑出來不同:
On Intel Skylake I get out = 3d7ff000, float = 0.062485 On AMD Rome I get out = 3d7ff800, float = 0.062492
在這邊的 case 可以看出來 AMD 算的比較正確 (誤差值比較低),但都還是在 spec 允許的誤差範圍。
後來作者還發現有其他不同的指令也有類似的問題,為了解決在 rr 上可以正確 replay 的問題,他生了對應的 mapping table 來解:「Emulating AMD Approximate Arithmetic Instructions On Intel」。
苦啊... 不過這個主題還蠻有趣的。