この記事は、インテル® デベロッパー・ゾーンに掲載されている「Dynamic alignment clause for vector pragma/directive」(https://software.intel.com/en-us/ARTICLES/DYNAMIC-ALIGNMENT-CLAUSE-FOR-VECTOR-PRAGMADIRECTIVE) の日本語参考訳です。
インテル® コンパイラー 19.0 は、vector プラグマ/ディレクティブ制御のため動的なアライメント節を提供します。
C/C++
#pragma vector dynamic_align[(pointer)]
#pragma vector nodynamic_align
Fortran
!DIR$ vector dynamic_align[(var)]
!DIR$ vector nodynamic_align
dynamic_align 節が指定されると、コンパイラーは指定されたポインターのピールループを生成します。ポインターが指定されないと、コンパイラーはアライメントされたロードおよびストアを生成するポインターを自動的に決定するか、ピールループを生成しません。nodynamic_align 節を指定すると、コンパイラーはピールループを生成しません。
次のサンプルコードについて考えてみましょう。
void foo(float * a, float * b, float * c, int len) // source test.cpp { int i; for (i = 0;i < len;i++) a[i] = b[i]*c[i]; }
コンパイルして最適化レポートを生成します。
$icc -fno-alias -c test.cpp -qopt-report=5 -qopt-report-phase=vec $cat test.optrpt ...... ループの開始 test.cpp(5,2) <ベクトル化のピールループ> LOOP END ループの開始 test.cpp(5,2) リマーク #15388: ベクトル化のサポート: 参照 a[i] にアラインされたアクセスが含まれています。 [ test.cpp(6,2) ] リマーク #15389: ベクトル化のサポート: 参照 b[i] にアラインされていないアクセスが含まれています。 [ test.cpp(6,9) ] リマーク #15388: ベクトル化のサポート: 参照 c[i] にアラインされたアクセスが含まれています。 [ test.cpp(6,14) ]
コンパイラーは、ピールループを生成して「a」および「c」に対してアライメントされたアクセスを自動的に選択します。
ループの前に #pragma vector dynamic_align(b) を記述し、再コンパイルして最適化レポートを確認します。
ループの開始 test.cpp(6,2) <ベクトル化のピールループ> LOOP END ループの開始 test.cpp(6,2) リマーク #15389: ベクトル化のサポート: 参照 a[i] にアラインされていないアクセスが含まれています。 [ test.cpp(7,2) ] リマーク #15388: ベクトル化のサポート: 参照 b[i] にアラインされたアクセスが含まれています。 [ test.cpp(7,9) ] リマーク #15389: ベクトル化のサポート: 参照 c[i] にアラインされていないアクセスが含まれています。 [ test.cpp(7,14) ]
コンパイラーは、ピールループを生成して「b」に対してアライメントされたアクセスを選択します。
dynamic_align(b) 節を nodynamic_align 節に置換し、再コンパイルして最適化レポートを確認します。
ループの開始 test.cpp(6,2) リマーク #15389: ベクトル化のサポート: 参照 a[i] にアラインされていないアクセスが含まれています。 [ test.cpp(7,2) ] リマーク #15389: ベクトル化のサポート: 参照 b[i] にアラインされていないアクセスが含まれています。 [ test.cpp(7,9) ] リマーク #15389: ベクトル化のサポート: 参照 c[i] にアラインされていないアクセスが含まれています。 [ test.cpp(7,14) ]
コンパイラーはピールループを生成せず、すべてのポインターアクセスはアライメントされていません。
詳細については、インテル® Parallel Studio XE 2019 Composer Edition の製品ドキュメントを参照してください。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。