8.159 --reassociate_saturation、--no_reassociate_saturation

サチュレート演算を使用するループ内でさらに強力な最適化を有効および無効にします。

使用法

サチュレート加算は結合的ではありません。つまり、(x+y)+zx+(y+z) と等しくない場合があります。たとえば、最大サチュレーティングが 50 の場合、 (40+20)-10 = 40 となり、一方で 40+(20-10) = 50 となります。
コンパイラの最大化は連想機能に依存し、再関連付けを使用して、より効率的なシーケンスへ式を並べ変えます。
--no_reassociate_saturation オプションは、サチュレート加算の再結合を禁止するので、サチュレート演算に対する最適化のレベルを制限します。
--reassociate_saturation オプションは、サチュレート加算を再結合するようにコンパイラに指示し、以下の最適化を有効にします。
  • --vectorize を使用してコンパイルする場合の サチュレーティング演算のベクトル化。
  • --vectorize なしでコンパイルしたとき、例えば -O3 -Otime を使用したコンパイル時などに、その他の最適化が実行される可能性があります。

制約条件

サチュレート加算は結合的ではありません。そのため、 --reassociate_saturation を有効にすると、式を縮小した結果の精度に影響が生じる可能性があります。

デフォルト

デフォルトは --no_reassociate_saturation です。

サンプル

次のコードはサチュレート加算を実行する関数 L_mac を含んでいます。したがって、--reassociate_saturation--vectorize が指定されていない限り、コンパイラはこのコードをベクトル化しません。
#include <dspfns.h>
int f(short *a, short *b)
{
    int i;
    int r = 0;
    for (i = 0; i < 100; i++)
         r=L_mac(r,a[i],b[i]);
    return r;
}
関連する概念
3.6 自動ベクトル化
関連する参考文書
8.192 --vectorize、--no_vectorize
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.