vector プラグマ/ディレクティブの動的アライメント節

インテル® DPC++/C++ コンパイラーインテル® Fortran コンパイラー

この記事は、インテル® デベロッパー・ゾーンに掲載されている「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 の製品ドキュメントを参照してください。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました