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