ベクトライザーはアライメントされたデータで実行する場合、より高速なコードを生成することができます。ここでは、driver.f90 の 配列 a、b、x を 16 バイト境界にアライメントすることによりベクトライザーのパフォーマンスを向上させます。このアライメントによって、ベクトライザーはすべての配列に速度の遅いアライメントされていないロード命令ではなく、アライメント済みロード命令を使用して、アライメントのランタイムテストを回避することできます。ALIGNED マクロを使用すると、driver.f90 の a、b、c にアライメント宣言子を挿入します。構文は次のとおりです。
!dir$attributes align : 16 :: a,b,c
これは、16 バイト境界でアライメントされた配列を作成するようコンパイラーに指示します。これにより、SSE アライメント済みロード命令が使用されるようになります。
さらに、行列 a の列の高さは 16 バイトの倍数になるようにパディングされなければなりません。これにより、a の各列が同じ 16 バイトのアライメントになります。実際、列間の一定のアライメントは、配列の開始をアライメントするよりも非常に重要です。
また、このアライメントによる利点を最大限に活かすためには、次の宣言子を使用して、matvec.f90 の配列がアライメントされていると安全に仮定できることをベクトライザーに知らせなければなりません。
!dir$ vector aligned
!dir$ vector aligned を使用する場合、ループのすべての配列またはサブ配列が確実に 16 バイトにアライメントされていなければなりません。そうでない場合、コンパイラーは誤ったコードを生成します。!dir$ vector aligned を使用していなくても、データのアライメントによりパフォーマンスの利点は得られます。
matvec.f90 の ALIGNED マクロによるコードを参照してください。
データを確実に一貫したアライメントにするには、ALIGNED マクロを追加した後、プログラムを再コンパイルしてください。
ifort -real-size 64 -vec-report2 -DALIGNED matvec.f90 driver.f90 -o MatVector
matvec.f90(32) (列 3): リマーク: ループがベクトル化されました。 matvec.f90(33) (列 3): リマーク: ループはベクトル化されませんでした: 内部ループではありません。 matvec.f90(38) (列 6): リマーク: ループがベクトル化されました。 driver.f90(59) (列 5): リマーク: ループはベクトル化されませんでした: 内部ループではありません。 driver.f90(59) (列 5): リマーク: ループはベクトル化されませんでした: ベクトル化は可能ですが非効率です。 driver.f90(59) (列 5): リマーク: ループはベクトル化されませんでした: 内部ループではありません。 driver.f90(59) (列 5): リマーク: ループはベクトル化されませんでした: 添字が複雑すぎます。 driver.f90(59) (列 5): リマーク: ループはベクトル化されませんでした: 内部ループではありません。 driver.f90(59) (列 5): リマーク: ループがベクトル化されました。 driver.f90(61) (列 5): リマーク: ループはベクトル化されませんでした: ベクトル化は可能ですが非効率です。 driver.f90(61) (列 5): リマーク: ループがベクトル化されました。 driver.f90(63) (列 21): リマーク: ループはベクトル化されませんでした: 内部ループではありません。 driver.f90(63) (列 21): リマーク: ループがベクトル化されました。 driver.f90(80) (列 29): リマーク: ループがベクトル化されました。 driver.f90(74) (列 7): リマーク: ループはベクトル化されませんでした: 非標準のループはベクトル化候補ではありません。
© 2010 Intel Corporation. 無断での引用、転載を禁じます。