ベクトライザーはアライメントされたデータで実行する場合、より高速なコードを生成することができます。ここでは、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 マクロによるコードを参照してください。
インテル® AVX 命令セット向けにコンパイルする場合は、データを 32 バイト境界にアライメントしてください。パフォーマンスが向上することがあります。この場合、!dir$ vector aligned は、コンパイラーにデータを 32 バイト境界にアライメントするよう指示します。
データを確実に一貫したアライメントにするには、ALIGNED マクロを追加した後、プログラムを再コンパイルしてください。
ifort -real-size 64 -vec-report2 -D ALIGNED 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): リマーク: ループはベクトル化されませんでした: 非標準のループはベクトル化候補ではありません。