昨天在寫MatrixMultiply SIMD優化的時候,由于SSE的資料較多,我想都沒想就寫了一組SSE加速的程序。結果晚上做Profiler的時候,發現SSE算法的速度太慢,結果見下。
進程/線程優先級最高
D3DX為D3DX9.LIB鏈接
vc71-Release默認優化。
SSE的測試數據是128bit對齊,使用movaps指令讀取。
預先預熱了緩存
Athlon XP 1800+, 512M, WD800JB
前面的數字是RDTSC測試出來的。
8255127 MatrixMultiply D3DX
8079411 MatrixMultiply 3DNow
101563037 MatrixMultiply SSE
250227542 MatrixMultiply C
423771291 Normalize SSE
31882680 Normalize 3DNow
51605359 Normalize D3DX
從以上數據我們可以看出,Matrix的乘法運算中,C的速度是最慢的,sse次之。
但是兩者與3DNow相差了一個數量級的性能。接下來的Normalize測試也可以看出這一點。
ps,不要懷疑代碼的質量,因為這三段代碼的相關代碼都經過類比的測試,大致可以認為這里面所有的代碼質量是類似的。(最關鍵的是,不是我寫的,哈哈!)
所以結論很簡單,就是,如果你要針對不同CPU做優化,最好送佛送到西,每一種指令集都進行優化,還有就是不要想當然的認為優化的結果一定就很好,因為CPU對常規指令的執行進行了充分的優化,再加上亂序執行的方式,對于小函數來說,SIMD的額外成本太高了,最明顯的就是DotProduct。
所以希望大家測試以后再決定優化的啟用。