ベクトライザーはアライメントされたデータで実行する場合、より高速なコードを生成することができます。ここでは、Driver.c の 配列 a、b、x を 16 バイト境界にアライメントすることによりパフォーマンスを向上させます。このアライメントによって、ベクトライザーはすべての配列に速度の遅いアライメントされていないロード命令ではなく、アライメント済みロード命令を使用して、アライメントのランタイムテストを回避することできます。ALIGNED マクロで __attribute キーワードを使用すると、Driver.c の a、b、x の宣言が変更されます。キーワードの構文は次のとおりです。
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.c の ALIGNED マクロによるコードを参照してください。
データを確実に一貫したアライメントにするには、ALIGNED プリプロセッサー定義を追加した後、プログラムをリビルドしてください。
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): リマーク: ループがベクトル化されました。
ここで、実行ファイルを開始して、実行時間を記録してください。
© 2010 Intel Corporation. 無断での引用、転載を禁じます。