[英]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.