|
以前用sse一直是处理视频图象 没搞过数值计算 随便试了下单精度的计算
var s,sbasic:single;
param1,param2,param3:single;
tb,te,tf:int64;
begin
sbasic:=1.0;
param1:=19.12;
param2:=19.13;
param3:=0.1;
queryperformancefrequency(tf);
queryperformanceCounter(tb);
//包括加/乘/除各一次 循环1000万次并对前次结果依赖 不会产生优化
//x87指令
Asm
mov ecx, 10000000
fld s
@loop:
fmul param1
fdiv param2
fadd param3
dec ecx
jnz @loop
fstp s
end;
queryperformanceCounter(te);
//输出时间消耗
memo1.Lines.Append(format('x87 %f ms %f ', [(te-tb)/tf*1000,s]) );
queryperformanceCounter(tb);
//SSE指令
Asm
mov ecx, 10000000
movss xmm0, sbasic
@loop:
movss xmm1, param1
movss xmm2, param2
movss xmm3, param3
mulss xmm0, xmm1
divss xmm0, xmm2
addss xmm0, xmm3
dec ecx
jnz @loop
movss s, xmm0
end;
queryperformanceCounter(te);
//输出时间消耗
memo1.Lines.Append(format('SSE %f ms %f ', [(te-tb)/tf*1000,s]) );
测试结果
x87 170.98 ms 191.33
SSE 93.73 ms 191.32
证明即使是不使用SIMD优化,只是替代x87浮点指令为sse指令就能获得接近一倍的速度提高.
但是可以发现, 2者的计算结果有一定的差异. 而双精度的计算结果是191.30,计算结果上反而是SSE更加精确. 所以在浮点计算时采用sse那是很有效果的,如果考虑到SIMD的并行计算,那提高不是一点半点啊.
注: 手头的 delphi 7只支持 sse,不支持sse2 ,没法试双精度了.我想应该区别不大.因为 sse里不管是使用
ps后缀并行计算4个还是采用ss后缀单独计算一个速度是没区别的.
[ 本帖最后由 viewlg 于 2007-9-30 20:46 编辑 ] |
|