6

GCC を使用した自動ベクトル化に取り組んでいます。顧客の要求により、組み込み関数または属性を使用する立場にありません。(ベクトル化をサポートするためのユーザー入力を取得できません)

ベクトル化できる配列のアラインメント情報が不明な場合、GCC は「ループ バージョン管理」のパスを呼び出します。ツリーでループのベクトル化が行われると、ループのバージョン管理が実行されます。ループがベクトル化可能であると識別され、データの位置合わせまたはデータの依存性に関する制約がそれを妨げている場合 (コンパイル時に決定できないため)、ループの 2 つのバージョンが生成されます。これらは、ループのベクトル化されたバージョンとベクトル化されていないバージョンであり、どのバージョンを実行するかを制御するためのアライメントまたは依存関係のランタイム チェックが含まれています。

私の質問は、どのようにアライメントを強制する必要があるのですか? ベクトル化可能なループが見つかった場合、アライメント情報が欠落しているため、ループの 2 つのバージョンを生成すべきではありません。

例えば。以下のコードを検討してください

short a[15]; short b[15]; short c[15];
int i;

void foo()
{
    for (i=0; i<15; i++)
    {
      a[i] = b[i] ;
    }
}

ツリー ダンプ (オプション: -fdump-tree-optimized -ftree-vectorize)

<SNIP>
     vector short int * vect_pa.49;
     vector short int * vect_pb.42;
     vector short int * vect_pa.35;
     vector short int * vect_pb.30;

    bb 2>:
     vect_pb.30 = (vector short int *) &b;
     vect_pa.35 = (vector short int *) &a;
     if (((signed char) vect_pa.35 | (signed char) vect_pb.30) & 3 == 0)    ;; <== (A)
       goto <bb 3>;
     else
       goto <bb 4>;

    bb 3>:
</SNIP>

「bb 3」では、ベクトル化されたコードのバージョンが生成されます。'bb 4' で、ベクトル化なしのコードが生成されます。これらは、アラインメント (ステートメント 'A') をチェックすることによって行われます。組み込み関数やその他の属性を使用せずに、ベクトル化されたコードのみを取得するにはどうすればよいですか (このランタイム アライメント チェックなし)。

4

2 に答える 2

4

問題のデータが静的に割り当てられている場合は、__align__GCC がサポートする属性を使用して、必要な境界に配置する必要があることを指定できます。これらの配列を動的に割り当てる場合は、アラインメント値によって過剰に割り当ててから、返されたポインターを必要なアラインメントまで上げることができます。

posix_memalign()この機能をサポートするシステムを使用している場合は、この機能を使用することもできます。malloc()最後に、は常に最大の組み込み型のサイズに合わせてメモリを割り当てることに注意してください。通常、double の場合は 8 バイトです。それ以上のものを必要としないのであれば、mallocそれで十分です。

編集: 割り当てコードを変更してそのチェックを強制的に true にする場合 (つまり、上記のように過剰割り当て)、コンパイラはループ コードを条件付けしないことを義務付ける必要があります。どうやら 8 バイト境界へのアライメントが必要な場合は、次のようになりますa = (a + 7) & ~3;

于 2009-11-10T03:58:43.107 に答える
0

これらのオプションを使用して正確なコードを使用すると、ループのバージョンが1つだけ取得されます。gcc -march=core2 -c -O2 -fdump-tree-optimized -ftree-vectorize vec.c

私のバージョンのGCCはgcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu8)です。

GCCはここで何か賢いことをしています。これにより、アレイが強制abに16バイトに整列されます。cおそらくc、ベクトル化可能なループで使用されることはないため、これは実行されません。

于 2009-11-20T08:10:11.967 に答える