Optimization 为什么SSE整数平均指令(PAVGB/PAVGW)在计算最终结果之前将临时和加1?

Optimization 为什么SSE整数平均指令(PAVGB/PAVGW)在计算最终结果之前将临时和加1?,optimization,sse,average,simd,Optimization,Sse,Average,Simd,最近我一直在为一个视频处理算法进行SSE优化。我需要用C代码编写完全相同的算法来交叉检查算法的正确性。我几次忘记了这个事实,这使得两个实现的结果变得不同 我可以修改C实现使它们匹配,因为这种差异并不重要。但是为什么这些指令是这样设计的呢?这背后有数学上的原因吗 “英特尔指令参考”仅提及此行为,未解释原因。我也尝试过谷歌搜索,但找不到任何相关信息 更新: 多亏了。我没有意识到这是舍入/截断问题。但由于两个操作数都是整数,因此唯一的分数将是0.5,并且它有2个“最近的整数”。对于这种情况,有几种舍入

最近我一直在为一个视频处理算法进行SSE优化。我需要用C代码编写完全相同的算法来交叉检查算法的正确性。我几次忘记了这个事实,这使得两个实现的结果变得不同

我可以修改C实现使它们匹配,因为这种差异并不重要。但是为什么这些指令是这样设计的呢?这背后有数学上的原因吗

“英特尔指令参考”仅提及此行为,未解释原因。我也尝试过谷歌搜索,但找不到任何相关信息

更新:


多亏了。我没有意识到这是舍入/截断问题。但由于两个操作数都是整数,因此唯一的分数将是0.5,并且它有2个“最近的整数”。对于这种情况,有几种舍入方法。说明中为什么特别使用四舍五入?大多数相关应用程序都需要舍入吗?

这是为了给出正确的舍入,即舍入到最近值,而不是截断。通常,当您用整数值除以N时,需要执行此操作以获得正确的舍入:

y = (x + N / 2) / N;
如果你只是这样做:

y = x / N;
然后您将得到一个截断的(四舍五入为零)结果

对于图像处理和DSP类型的应用,通常首选从圆到最近