昨天在写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。
所以希望大家测试以后再决定优化的启用。