免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3516 | 回复: 6
打印 上一主题 下一主题

使用CPU 专用指令提高float运算速度的一个小例子 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-27 20:03 |只看该作者 |倒序浏览
若有一批float要进行y= sqrt(x1*x1+x2*x2)+0.5 的计算
在32bit的CPU上用常规模式进行计算则明显耗时.
而用INTEL CPU自己专用的SSE指令进行运算,则有明显的优势:
windows2000+ VC

  1. int i;
  2.              float x1_float_data_block[]={...}; // x1数据块
  3.              float x2_float_data_block[]={...}; // x2数据块
  4.              float y_float_data_block[sizeof(x1_float_data_block)/sizeof(float)];    // y数据块,结果
  5.              int num_float=sizeof(x1_float_data_block)/sizeof(float);                // 数据块中float的数量

  6.              int count = num_float/4;
  7.              float f = 0.5f;
  8.              _asm    {
  9.                          movss   xmm2, f         
  10.                          shufps  xmm2, xmm2, 0   
  11.                          mov         esi, x1_float_data_block               
  12.                          mov         edx, x2_float_data_block               
  13.                          mov         edi, y_float_data_block               
  14.                          mov         ecx, count                             
  15.                  sse_loop:        
  16.                          movaps      xmm0, [esi]
  17.                          mulps       xmm0, xmm0  
  18.                          movaps      xmm1, [edx]
  19.                          mulps       xmm1, xmm1  
  20.                          addps       xmm0, xmm1  
  21.                          sqrtps      xmm0, xmm0  
  22.                          addps       xmm0, xmm2  
  23.                          movaps      [edi],xmm0  
  24.                          add         esi, 16     
  25.                          add         edx, 16     
  26.                          add         edi, 16     
  27.                          dec         ecx         
  28.                          jnz         sse_loop                    
  29.                      }
  30.                for(i=0;i<num_float;i++)  
  31.                          printf("...",y_float_data_block[i],...
  32.                .....
复制代码

[ 本帖最后由 system888net 于 2008-5-18 10:51 编辑 ]

评分

参与人数 1可用积分 +3 收起 理由
prolj + 3 好例子

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2008-04-27 20:22 |只看该作者
这条printf("...",y_float_data_block,...
在上面edit了几次总是显示不出来[ i ],不知为何

[ 本帖最后由 system888net 于 2008-4-27 20:23 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-04-27 21:02 |只看该作者
运算速度能提高一点还是许多?

论坛徽章:
0
4 [报告]
发表于 2008-04-28 19:16 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2008-05-18 10:48 |只看该作者
原帖由 jamesr 于 2008-4-28 19:16 发表
使用 代把码括起来。
另外,应该说明这段代码的运行环境。这种内联汇编不是gcc格式的。


谢谢提醒,已加了code 和/code,平台 windows2000+vc

[ 本帖最后由 system888net 于 2008-5-18 10:51 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-05-18 16:49 |只看该作者

回复 #1 system888net 的帖子

速度是明显快了,顶...

论坛徽章:
0
7 [报告]
发表于 2008-05-18 16:53 |只看该作者
此程序调用的是FPU内部的指令
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP