-1

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

显示了部分代码(在英特尔 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

谢谢

4

3 回答 3

4

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

于 2013-05-01T08:15:46.123 回答
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 个时钟周期。

于 2013-05-01T09:00:08.363 回答
0

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

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

于 2015-08-28T23:29:14.160 回答