Почему инструкции усреднения целочисленных значений SSE (PAVGB / PAVGW) добавляют 1 к временной сумме, прежде чем вычислять окончательный результат? - PullRequest
0 голосов
/ 10 октября 2011

Я недавно работал над оптимизацией SSE для алгоритма обработки видео.Мне нужно написать точно такой же алгоритм в коде C, чтобы проверить правильность алгоритма.Я несколько раз забывал об этом факте, что делает результаты двух реализаций различными.

Я могу изменить реализацию C, чтобы они соответствовали, так как это различие не имеет значения.Но почему эти инструкции разработаны так?Есть ли какая-то математическая причина?

Справочник по инструкциям Intel только упоминает это поведение и не объясняет почему.Я также попробовал поискать в Google, но ничего не смог найти по этому поводу.

ОБНОВЛЕНИЕ:

Благодаря Ответ Павла .Я не понял, что это проблема округления / усечения.Но так как оба операнда являются целыми числами, единственная дробь будет 0,5, и у нее есть 2 "ближайших целых числа".AFAIK Есть несколько методов округления для этой ситуации.Почему в инструкциях специально используется округление?Нужно ли округлять большинство связанных приложений?

1 Ответ

1 голос
/ 10 октября 2011

Это дает правильное округление, т.е. округление до ближайшего, а не усечение. Обычно, когда вы делите на N целочисленные значения, вам нужно сделать это, чтобы получить правильное округление:

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

Если вы просто сделаете:

y = x / N;

тогда вы получите усеченный результат (с округлением до нуля).

Округление до ближайшего обычно является предпочтительным для обработки изображений и приложений типа DSP.

...