繁体   English   中英

上证所int64本征

[英]SSE int64 Intrinsics

请我尝试对一些int64算法进行优化。 我需要做一些操作,例如左右移位,除法,余数等等,但是我已经搜索了所有SSE内部函数,却一无所获。 左移不适用于负值。 请你指导我吗?

显示了部分代码(在Intel i7上):

u_a2b2=(MatrixAiB1[0]>>2*z_bits);
res_ri=(MatrixAiB1[0] % (__int64(1)<<2*z_bits));
if (MatrixAiB1[0] >= 0)                         
  {
     if (abs(res_ri) > (__int64(1)<<41))    
     {          
         u_a2b2=u_a2b2+1;
     }
   }
else
{
     if (abs(res_ri) < (__int64(1)<<41))    
     {
        if (u_a2b2>=0)
         {
        u_a2b2=u_a2b2-1;
         }
       else 
        {
        u_a2b2=u_a2b2+1;
        }
      }

}

一切都是int64

谢谢

老实说,尝试优化这种代码毫无意义。 只需声明一个64位大小的变量,然后让编译器完成其余工作即可。 在64位版本上,生成的指令全部是CPU固有的(即,仅一条CPU指令),而在32位版本上,编译器编写者将已经完成了寻找在32位上实现64位操作的最佳方法的艰巨工作。位系统。

这一点:

 res_ri=(MatrixAiB1[0] % (__int64(1)<<2*z_bits));

可能被替换为:

 res_ri=(MatrixAiB1[0] & (__int64(1)<<2*z_bits)-1);

(如果结果应该是负数或正数,则您需要采取一些措施来解决此问题,但是如果%的任一边为负数,则它是“实现定义的”,因此,我想您不应该依赖于如果MatrixAiB1[0]小于零, MatrixAiB1[0]发生)。

&操作比%快20倍% ,因此对于5000个元素,应该可以很好地改善约100000个时钟周期。

有很多SSE2和许多用于处理64位整数的AVX2内部函数。 如果您的处理器支持AVX2,则可以通过一次处理4个64位值来真正提高代码速度。

您可以在这里找到非常全面的清单: https : //software.intel.com/sites/landingpage/IntrinsicsGuide/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM