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') をチェックすることによって行われます。組み込み関数やその他の属性を使用せずに、ベクトル化されたコードのみを取得するにはどうすればよいですか (このランタイム アライメント チェックなし)。