この記事は、インテル® ソフトウェア・サイトに掲載されている「Vectorization Essentials」の日本語参考訳です。
はじめに
ここでは、ベクトル化について説明します。ベクトル化とは、プロセッサーがベクトルの N 個のデータ要素 (浮動小数点オブジェクト、整数、倍精度浮動小数点オブジェクトなどのスカラー・データ・オブジェクトの 1 次元配列) に対して、同じ処理を同時に行うデータ並列プログラミングの形式です。
インテル® Xeon® プロセッサー製品ファミリー上でパフォーマンスを引き出すには、ベクトル化のスキルと知識が不可欠です。アプリケーションをベクトル化することで、理想的なケースでは最大で 8 倍 (倍精度浮動小数点) または 16 倍 (単精度浮動小数点) のスピードアップが達成可能です。すべてのアプリケーションでこのようなスピードアップが得られるとは限りませんが、コードがベクトル化されていなければ、インテル® Xeon® プロセッサー製品ファミリー上で利用可能なすべての計算機能を使用できないことは確かです。
目標
最初に、ベクトル化とは何か、ベクトル化レポートを使用してコンパイラーがベクトル化できるコード領域を特定する方法など、ベクトル化について理解することが不可欠です。ベクトル化レポートを生成するには、-qopt-report オプションを使用します。また、コンパイラーがベクトル化できないコード領域とその理由を知ることも重要です。
すべてのベクトル化作業をコンパイラーが行ってくれると期待することは現実的ではありません。コンパイラーによるベクトル化を支援するため、コンパイラー・プラグマとコンパイラー・ディレクティブを知っておく必要があります。効率良くベクトル化するための重要な手法の 1 つは、データのアライメントです。ここでは、データのアライメントを制御し、コンパイラーがアライメントされたデータを認識できるように支援する方法を説明します。
また、ポインター・エイリアシングとその最適化およびベクトル化への効果に触れ、ポインター引数がエイリアスされていないことをコンパイラーに知らせる方法についても説明します。
さらに、外側のループをベクトル化する新しい方法も紹介します。
OpenMP* 4.0 以降には、ベクトル化を有効にするディレクティブがあります。これらは、古いインテル® Cilk™ Plus ディレクティブの代わりに使用すべきです。インテル® コンパイラーは、次の OpenMP* 機能をサポートします。
- インテル® Fortran コンパイラーの OpenMP* サポート (https://software.intel.com/en-us/fortran-compiler-developer-guide-and-reference-openmp-support)
- インテル® C++ コンパイラーの OpenMP* サポート (https://software.intel.com/en-us/cpp-compiler-developer-guide-and-reference-openmp-support)
以下のトピックで、ベクトル化について詳しく説明します。リンクをクリックすると、そのトピックが表示されます。
- 次のトピックは、必読です。
- OpenMP* 4.0 のベクトル化を使用したパフォーマンスの基本 (https://software.intel.com/en-us/videos/performance-essentials-using-openmp-40-vectorization) (ビデオ)
- ループをベクトル化するための条件
- Fortran の配列データおよび引数とベクトル化
- インテル® Fortran コンパイラーでの割付け配列とポインターのアライメント (https://software.intel.com/en-us/articles/alignment-of-fortran-allocatable-arrays-pointers-in-intel-fortran-compiler)
- Fortran の明示的なベクトル・プログラミング
- ベクトル化および最適化レポート
- ベクトル化の可能性を高めるデータ・アライメント
- ポインター・エイリアシングとベクトル化
- 次のトピックは、より高度なベクトル化を行う手法を紹介します。
まとめ
ここでは、さまざまなベクトル化手法と最適化について説明しました。効率良いベクトル化なくして、インテル® Xeon® プロセッサー製品ファミリー上で優れたパフォーマンスを引き出すことはできません。次の点を理解することが不可欠です。
- -qopt-report コンパイラー・オプションを使用して、アプリケーションのベクトル化された領域、されない領域およびその理由を特定する。
- ベクトル化におけるデータのアライメントの重要性、およびデータのアライメントを強制する方法。
- ポインター・エイリアシングについて。また、複数のポインターが同じデータをエイリアスしていないことをコンパイラーに知らせる方法。
- SIMD 対応関数について。また、SIMD 対応関数がベクトル化を支援する方法。
さらに、ここでは、外側のループのベクトル化手法とベクトル化された乱数生成についても説明しました。「インテルのベクトル化ツール」の関連リソースも参照してください。
次のステップ
インテル® Xeon® プロセッサー製品ファミリー上にアプリケーションを移植してチューニングを行うには、各リンクのトピックを参照してください。アプリケーションのパフォーマンスを最大限に引き出すために必要なステップを紹介しています。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。