我遇到了一個奇怪的問題。我工作的一種算法是由大量的計算這樣32位與64位浮點性能
q = x(0)*y(0)*z(0) + x(1)*y(1)*z(1) + ...
其中總和的長度爲4和7
之間
原來的計算都使用64位精度完成的。對於實驗,我嘗試對x,y,z輸入值使用32位精度(以便計算使用32位執行),並將最終結果存儲爲64位值(直接轉換)。我希望32位性能更好(緩存大小, SIMD大小等),但令我驚訝的是,性能沒有差別,甚至可能會減少。有問題的架構是Intel 64,Linux和GCC。兩個代碼似乎都使用SSE,並且這兩種情況下的數組都對齊到16字節的邊界。
爲什麼會這樣?到目前爲止,我的猜測是32位精度只能在前四個元素上使用SSE,其餘的都是通過施放開銷連續進行的。
您已添加賞金 - 您對dsimcha的回答有什麼不喜歡的?也許值得嘗試一下最新的GCC或英特爾的編譯器http://software.intel.com/en-us/articles/non-commercial-software-download/,看看他們是否做得更好,編譯/矢量化。 – Rup 2010-07-06 16:56:16
@Rup我喜歡他的回答,但也希望其他意見,所以我把一個賞金 – Anycorn 2010-07-06 19:12:21