请我尝试对某些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
由于
答案 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/。