データのアライメントによりパフォーマンスを向上する

ベクトライザーはアライメントされたデータで実行する場合、より高速なコードを生成することができます。ここでは、Driver.c の 配列 abx を 16 バイト境界にアライメントすることによりパフォーマンスを向上させます。このアライメントによって、ベクトライザーはすべての配列に速度の遅いアライメントされていないロード命令ではなく、アライメント済みロード命令を使用して、アライメントのランタイムテストを回避することできます。 ALIGNED マクロで __attribute キーワードを使用すると、Driver.cabx の宣言が変更されます。キーワードの構文は次のとおりです。

float array[30] __attribute((aligned(base, [offset])));

この命令は、オフセットが "offset" (デフォルト=0) バイトの "base" バイト境界でアライメントされた配列を作成するようコンパイラーに指示します。例:

FTYPE a[ROW][COLWIDTH] __attribute((aligned(16)));

さらに、行列 a の行の長さが 16 バイトの倍数になるようにパディングする必要があります。a の各行は 16 バイトのアライメントになります。 また、このアライメントによる利点を最大限に活かすには、#pragma vector aligned を使用して、Multiply.c の配列がアライメントされていると安全に仮定できることをベクトライザーに知らせる必要があります。

#pragma vector aligned を使用する場合、ループのすべての配列またはサブ配列が確実に 16 バイトにアライメントされていなければなりません。 そうでない場合、ランタイムエラーが発生することがあります。#pragma vector aligned を使用していなくても、データのアライメントによりパフォーマンスの利点は得られます。 Multiply.cALIGNED マクロによるコードを参照してください。

インテル® AVX 命令セット向けにコンパイルする場合は、データを 32 バイト境界にアライメントしてください。パフォーマンスが向上することがあります。この場合、#pragma vector aligned は、コンパイラーにデータを 32 バイト境界にアライメントするよう指示します。

データを確実に一貫したアライメントにするには、ALIGNED マクロを追加した後、プログラムを再コンパイルしてください。

icc -std=c99 -vec-report2 -D NOALIAS -D ALIGNED Multiply.c Driver.c -o MatVector

Multiply.c(45) (列 2): リマーク: ループはベクトル化されませんでした: 内部ループではありません。
Multiply.c(55) (列 3): リマーク: ループがベクトル化されました。
Driver.c(140) (列 2): リマーク: ループはベクトル化されませんでした: 内部ループではありません。
Driver.c(140) (列 2): リマーク: ループはベクトル化されませんでした: ベクトル化は可能ですが非効率です。
Driver.c(140) (列 2): リマーク: ループがベクトル化されました。
Driver.c(141) (列 2): リマーク: ループはベクトル化されませんでした: ベクトル化は可能ですが非効率です。
Driver.c(164) (列 2): リマーク: ループがベクトル化されました。
Driver.c(145) (列 2): リマーク: ループはベクトル化されませんでした: 非標準のループはベクトル化候補ではありません。
Driver.c(81) (列 2): リマーク: ループがベクトル化されました。
Driver.c(69) (列 2): リマーク: ループはベクトル化されませんでした: ベクトル化は可能ですが非効率です。
Driver.c(72) (列 3): リマーク: ループがベクトル化されました。
Driver.c(54) (列 2): リマーク: ループはベクトル化されませんでした: 内部ループではありません。
Driver.c(55) (列 3): リマーク: ループはベクトル化されませんでした: ベクトル化は可能ですが非効率です。
Driver.c(60) (列 3): リマーク: ループはベクトル化されませんでした: 内部ループではありません。
Driver.c(61) (列 4): リマーク: ループがベクトル化されました。

行番号および列番号は異なる場合があります。

ここで、実行ファイルを開始して、実行時間を記録してください。

戻る: ポインター一義化によりパフォーマンスを向上する 次へ: プロシージャー間の最適化を使用してパフォーマンスを向上する


このヘルプトピックについてのフィードバックを送信