< 目次

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

ベクトル化はアライメントされたデータで実行する場合、より高速なコードを生成することができます。ここでは、driver.f90 の 配列 abc を 16 バイト境界にアライメントすることによりベクトル化のパフォーマンスを向上させます。このアライメントによって、ベクトル化はすべての配列に速度の遅いアライメントされていないロード命令ではなく、アライメント済みロード命令を使用して、アライメントのランタイムテストを回避することできます。ALIGNED マクロを使用すると、driver.f90abc にアライメント・ディレクティブを挿入します。構文は次のとおりです。

!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.f90ALIGNED マクロによるコードを参照してください。

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

データを確実に一貫したアライメントにするには、ALIGNED プリプロセッサー定義を追加した後、プログラムをリビルドしてください。

[Fortran] > [Preprocessor (プリプロセッサー)] > [Preprocessor Definitions (プリプロセッサーの定義)]

プロジェクトをリビルドします。レポートにアラインされたアクセスが表示されます。