SSE int64内在函数

时间:2013-05-01 08:09:00

标签: c++ sse

请我尝试对某些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

由于

3 个答案:

答案 0 :(得分:4)

老实说,尝试优化此类代码毫无意义。只需声明一个64位大小的变量,让编译器完成剩下的工作。在64位版本中,生成的指令都是CPU固有的(即只有一个CPU指令),在32位版本中,编译器编写者已经完成了在32位上找到实现64位操作的最佳方法的艰苦工作。位系统。

答案 1 :(得分:0)

这一位:

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

可能会被替换为:

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

(如果结果应该是消极的或肯定的,你需要一些东西来解决这个问题,但是如果%的一方是负面的,那就是“定义了”,所以我想你不应该依赖于MatrixAiB1[0]小于零时会发生什么。

&操作比%快约20倍,因此应该为5000个元素提供大约100000个时钟周期的改进。

答案 2 :(得分:0)

有很多SSE2和更多的AVX2内在函数用于处理64位整数。如果你的处理器支持AVX2,你可以通过一次处理4个64位值来真正加速你的代码...

您可以在此处找到一个非常全面的列表:https://software.intel.com/sites/landingpage/IntrinsicsGuide/