ループGCCバージョン管理
-
19-09-2019 - |
質問
るための自動ベクトル化GCC.私は利用intrinsicsまたは属性によりお客様の要件を満たす。いたものの、ユーザー入力支援ベクトル化)
場合、配列情報の配列できるvectorizedは、GCCを呼び出しのパスfor'ループのバージョン'.ループのバージョンの実行時にループベクトル化を行います。がループであることを明らかにしたvectorizableの制約データをアライメントデータ依存性を阻害するとnhkサイトを離れまで確定できないコンパイル時に、二つのバージョンのループが生成されます。これらのvectorized非vectorizedバージョンのループと共にランタイムでチェックアライメント依存性を制御するオープンアクセスが実行されます。
私の質問は、どのようにして実施の配?している場合は見つかりループはvectorizableったものの、発生しない二つのバージョンのループでの配置情報です。
ります。考え、以下のコード
short a[15]; short b[15]; short c[15];
int i;
void foo()
{
for (i=0; i<15; i++)
{
a[i] = b[i] ;
}
}
ツリーのダンプ(オプション:-fdump-ツリーの最適化-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>
でbb3'版vectorizedコードを生成します。でbb4'コードなベクトル化が生成されます。これらの行をチェックすると、アライメント計算書'A').現在を使用せずにintrinsicsその他の属性には、どのようにのみ取得しまvectorizedコード(このランタイムラチェック。)
解決
問題のデータは静的に割り当てられている場合GCCは、それが必要な境界に整列させる必要があることを指定するには、サポートされていること、そして、あなたは__align__
属性を使用することができます。あなたが動的にこれらの配列を割り当てている場合は、アライメント値により過割り当て、その後、あなたが必要とするアライメントに返されたポインタをつり上げることができます。
またposix_memalign()
機能を使用することができます。最後に、そのmalloc()
を注意することは、常に、最大のビルトイン型のサイズに合わせ、二重のため、一般的に8バイトのメモリを割り当てます。あなたはそれよりも良い必要がない場合は、malloc
で十分です。
の編集の:あなたは(すなわちoverallocate、上記で示唆したように)真であるためにそのチェックを強制するために、あなたの割り当てコードを変更する場合、コンパイラはループコードを条件付けていないことで義務付けるべきです。あなたは8バイト境界にアライメントを必要に応じてそれはそうと、それはa = (a + 7) & ~3;
ようなものになるだろう。
他のヒント
かみのショールーム:イメージは、 ご利用の正確なコードにこのオプション: gcc -march=core2 -c -O2 -fdump-tree-optimized -ftree-vectorize vec.c
私版GCCが gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu8)
.
GCCであっても賢いこちらです。での軍の配列 a
や b
する16バイトが揃います。んでいることを c
, デルを推計したところ、 c
は一切使用しておりませんでvectorizableループを実行します。