使用CPU 专用指令提高float运算速度的一个小例子
若有一批float要进行y= sqrt(x1*x1+x2*x2)+0.5 的计算
在32bit的CPU上用常规模式进行计算则明显耗时.
而用INTEL CPU自己专用的SSE指令进行运算,则有明显的优势:
windows2000+ VC
- int i;
- float x1_float_data_block[]={...}; // x1数据块
- float x2_float_data_block[]={...}; // x2数据块
- float y_float_data_block[sizeof(x1_float_data_block)/sizeof(float)]; // y数据块,结果
- int num_float=sizeof(x1_float_data_block)/sizeof(float); // 数据块中float的数量
- int count = num_float/4;
- float f = 0.5f;
- _asm {
- movss xmm2, f
- shufps xmm2, xmm2, 0
- mov esi, x1_float_data_block
- mov edx, x2_float_data_block
- mov edi, y_float_data_block
- mov ecx, count
- sse_loop:
- movaps xmm0, [esi]
- mulps xmm0, xmm0
- movaps xmm1, [edx]
- mulps xmm1, xmm1
- addps xmm0, xmm1
- sqrtps xmm0, xmm0
- addps xmm0, xmm2
- movaps [edi],xmm0
- add esi, 16
- add edx, 16
- add edi, 16
- dec ecx
- jnz sse_loop
- }
- for(i=0;i<num_float;i++)
- printf("...",y_float_data_block[i],...
- .....
复制代码
[ 本帖最后由 system888net 于 2008-5-18 10:51 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这条printf("...",y_float_data_block,...
在上面edit了几次总是显示不出来[ i ],不知为何
[ 本帖最后由 system888net 于 2008-4-27 20:23 编辑 ]
运算速度能提高一点还是许多?
谢谢提醒,已加了code 和/code,平台 windows2000+vc
[ 本帖最后由 system888net 于 2008-5-18 10:51 编辑 ]
速度是明显快了,顶...
此程序调用的是FPU内部的指令