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

同カテゴリーの次の記事

明示的なベクトル・プログラミング – 最も一般的な手法

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Dynamic alignment clause for vector pragma/directive」の日本語参考訳です。


インテル® コンパイラー 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 の製品ドキュメントを参照してください。

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

関連記事

  • インテル® Advisor を利用したガイド付きコードのベクトル化インテル® Advisor を利用したガイド付きコードのベクトル化 この記事は、Go Parallel に公開されている「GUIDED CODE VECTORIZATION WITH INTEL ADVISOR XE」 […]
  • マルチスレッド開発ガイド: 1.8 アセンブリーや組込み関数を利用することなく AVX を使用するにはマルチスレッド開発ガイド: 1.8 アセンブリーや組込み関数を利用することなく AVX を使用するには この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Using AVX Without Writing AVX Code」の日本語参考訳です。 1. 概要とツール インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) は、インテル® ストリーミング SIMD 拡張命令 (インテル® […]
  • Parallel STL: C++ STL コードのパフォーマンスの向上Parallel STL: C++ STL コードのパフォーマンスの向上 この記事は、インテルの The Parallel Universe Magazine 28 号に収録されている、新機能の Parallel STL を利用してパフォーマンスを向上する方法を紹介した章を抜粋翻訳したものです。 コンピューティング・システムは、シングルスレッドと SISD […]
  • R を使用した HPC: 基本R を使用した HPC: 基本 この記事は、インテルの The Parallel Universe Magazine 28 号に収録されている、HPC 分野での R の使用について紹介した章を抜粋翻訳したものです。 R はハイパフォーマンス・コンピューティング (HPC) に適していないと言い切る人もいれば、その可能性は否定しないものの HPC での […]
  • 電光石火の R マシンラーニング・アルゴリズム電光石火の R マシンラーニング・アルゴリズム この記事は、インテルの The Parallel Universe Magazine 26 号に収録されている、インテル® DAAL と最新のインテル® Xeon Phi™ プロセッサーにより成果を上げる方法に関する章を抜粋翻訳したものです。 データ・サイエンティストは、最新のインテル® Xeon […]