使用CPU 专用指令提高float运算速度的一个小例子

发布于 2022-09-18 21:34:46 字数 5430 浏览 38 评论 0

若有一批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 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

埋葬我深情 2022-09-25 21:34:46

这条printf("...",y_float_data_block,...
在上面edit了几次总是显示不出来[ i ],不知为何

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

撕心裂肺的伤痛 2022-09-25 21:34:46

运算速度能提高一点还是许多?

苏别ゝ 2022-09-25 21:34:46

原帖由 jamesr 于 2008-4-28 19:16 发表
使用 代把码括起来。
另外,应该说明这段代码的运行环境。这种内联汇编不是gcc格式的。

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

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

九厘米的零° 2022-09-25 21:34:46

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

べ繥欢鉨o。 2022-09-25 21:34:46

此程序调用的是FPU内部的指令

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文