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

时间:2011-10-10 09:49:39

标签: optimization sse average simd

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

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

英特尔指令参考仅提及此行为,并未解释原因。我也试过谷歌搜索,但没有找到任何关于它。

更新:

感谢Paul's answer。我没有意识到这是舍入/截断问题。但由于两个操作数都是整数,所以唯一的分数是0.5,它有2“最接近的整数”。对于这种情况,AFAIK有几种舍入方法。为什么说明具体使用四舍五入?大多数相关的应用程序需要四舍五入吗?

1 个答案:

答案 0 :(得分:1)

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

y = (x + N / 2) / N;

如果您这样做:

y = x / N;

然后你会得到一个截断的(舍入到零)结果。

对于图像处理和DSP类型应用,通常首选舍入到最近。