2011-10-10 1 views
0

私は最近、ビデオ処理アルゴリズムのSSE最適化に取り組んでいます。アルゴリズムの正確性をクロスチェックするために、Cコードに全く同じアルゴリズムを記述する必要があります。私はこの事実を何度も忘れてしまったので、2つの実装の結果が異なるようになりました。最終結果を計算する前に、SSE整数平均命令(PAVGB/PAVGW)が一時的な合計に1を加算するのはなぜですか?

この違いは問題ではないので、C実装を変更して一致させることができます。しかし、なぜこれらの命令はこのように設計されていますか?それの後ろに数学的な理由はありますか?

「インテル・インストラクション・リファレンス」にはこの動作が記載されているだけで、理由は説明されていません。私もグーグルで試しましたが、それについて何も見つかりませんでした。

UPDATE:Paul's answer

感謝。私はそれが丸め/切捨ての問題であることに気付かなかった。しかし、両方のオペランドは整数なので、唯一の端数は0.5になり、2の "最も近い整数"を持ちます。 AFAIKには、この状況のた​​めのいくつかの丸め方法があります。命令が特に切り上げを使用する理由ほとんどの関連アプリケーションは切り上げが必要ですか?

答えて

1

これは、正しい丸め、つまり切り捨てではなく最も近い丸めを与えることです。

y = x/N; 

は、あなたが切り捨て(ゼロへの丸め)を取得します:あなただけ行う場合

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

:一般的に、あなたは正しい丸めを取得するために、これを行うために必要な整数値をNで割るとき結果。

画像処理およびDSPタイプのアプリケーションでは、最も近いものに丸めるのが一般的です。

関連する問題