飽和演算
読み:ほうわえんざん
外語:saturation calculation
桁溢れした時には、その飽和点を返す演算のこと。
概要
ディジタル量の演算において、演算結果がオーバーフローする場合、自動的に値を最小値〜最大値の範囲に修正する機能をもった演算。
例えば16ビットで考えると、数値は0〜0xFFFFまでありうるが、0xFFFFに1を加えても溢れることはなく飽和点である0xFFFFを返す。このような加算を飽和加算という。
特徴
用途
画像処理や音声処理では、加算を続けて飽和時には飽和点に戻すような処理が求められる。この飽和演算は、それを自動的に行なってくれる演算機能である。
たとえば、画面の輝度を上げる(下げる)処理の場合、一定以上の明るさでは真っ白(暗さでは真っ黒)より明るさが変わることはない。そういった上限(下限)付きの処理として、よく使われている。
機能
DSPなどでは一般的な演算である。
最近ではx86系プロセッサーでも、マルチメディア命令セットにこのような演算が存在する。MMXなどがある。
たとえばMMXの飽和加算/減算の場合、次のような命令がある。
- paddsb/psubsb ‐ 符号付きパックド・バイトの飽和加算/減算 演算結果が127を超える場合は127に、-128を下回る場合は-128に丸め込む。
- paddsw/psubsw ‐ 符号付きパックド・ワードの飽和加算/減算 演算結果が32767を超える場合は32767に、-32768を下回る場合は-32768に丸め込む。
- paddusb/psubusb ‐ 符号なしパックド・バイトの飽和加算/減算 演算結果が255を超える場合は255に、0を下回る場合は0に丸め込む。
- paddusw/psubusw ‐ 符号なしパックド・ワードの飽和加算/減算 演算結果が65535を超える場合は65535に、0を下回る場合は0に丸め込む。
速度
飽和時には返す値を飽和点に戻す処理が必要となる。
このため、それを行なわない演算(ラップアラウンド)よりも処理が遅くなりがちである。
プログラム
CやC++などの場合、標準では飽和演算の関数や演算子が用意されていないので、マルチメディア命令の飽和演算命令を使うかどうかは、コンパイラー次第である。
全自動で飽和処理を判定するようなコンパイラーもあるが、うまく判定して処理を最適化できるかどうかもまたコンパイラー次第である。
この最適化技術に関連して、飽和演算の計算部分を自動判定するロジックは、特許となっているものもある。
再検索