インテル® MIC アーキテクチャー向けの高度な最適化 - ベクトル化の基本
この記事は、インテル® ソフトウェア・サイトに掲載されている「Vectorization Essentials」の日本語参考訳です。
はじめに
ここでは、ベクトル化について説明します。ベクトル化とは、データ並列プログラミングの形式です。プロセッサーがベクトルの N 個のデータ要素 (浮動小数点オブジェクト、整数、倍精度浮動小数点オブジェクトなどのスカラー・データ・オブジェクトの 1 次元配列) に対して、同じ処理を同時に行います。
インテル® Xeon Phi™ コプロセッサーのようなインテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャー上でパフォーマンスを引き出すには、ベクトル化の技術と知識が不可欠です。アプリケーションをベクトル化することで、理想的なケースでは、インテル® Xeon Phi™ コプロセッサーにおいて最大で 8 倍 (倍精度浮動小数点) または 16 倍 (単精度浮動小数点) のスピードアップが達成可能です。すべてのアプリケーションでこのようなスピードアップが得られるとは限りませんが、コードがベクトル化されていなければ、インテル® MIC アーキテクチャー上で効率良く実行されないことは確かです。
目標
最初に、ベクトル化とは何か、-vec-report を使ってコンパイラーがベクトル化できるコード領域を特定する方法など、ベクトル化について理解することが不可欠です。また、コンパイラーがベクトル化できないコード領域とその理由を知ることも重要です。
すべてのベクトル化作業をコンパイラーに期待することは現実的ではありません。コンパイラーによるベクトル化を支援するため、コンパイラー・プラグマと指示句を知っておく必要があります。効率良くベクトル化するための重要な手法の 1 つは、データのアライメントです。ここでは、データのアライメントを制御し、コンパイラーがアライメントされたデータを認識できるように支援する方法を説明します。
C/C++ ユーザーは、コンパイラーがベクトル化可能な式を認識できるように、インテル® Cilk™ Plus の配列ベクトル構文 (Fortran の配列構文に似ている) の使用を検討すべきです。ここでは、ポインター・エイリアシングとその最適化およびベクトル化への効果に触れ、ポインター引数がエイリアスされていないことをコンパイラーに知らせる方法についても説明します。
さらに、外部ループをベクトル化する新しい方法も紹介します。
トピック
以下のトピックで、ベクトル化について詳しく説明します。リンクをクリックすると、そのトピックが表示されます。
- 次のトピックは、必読です。
- インテル® Cilk™ Plus の配列表記 (アレイ・ノーテーション) と要素関数を使用する C/C++ ユーザー向けのベクトル化 (https://software.intel.com/sites/default/files/managed/f0/24/4.1-cilkplus-vectorization.pdf)
- ガイド付き自動並列化 (GAP)
- Fortran の配列データおよび引数とベクトル化
- ベクトル化および最適化レポート
- ベクトル化の可能性を高めるデータ・アライメント
- ポインター・エイリアシングとベクトル化 (https://software.intel.com/sites/default/files/managed/01/07/4.4-pointer-aliasing-and-vectorization.pdf)
- 次のトピックは、より高度なベクトル化を行う手法を紹介します。
- 外部ループのベクトル化
- インテル® Cilk™ Plus の配列表記による外部ループのベクトル化 (C/C++ ユーザー向け)
- 配列表記のロングベクトルとショートベクトルとの間のトレードオフ (C/C++ ユーザー向け)
- ベクトルのフル活用
- 乱数を使用するループのベクトル化
- 手動によるループアンロールの回避
- その他の一般的なベクトル化手法
まとめ
ここでは、さまざまなベクトル化手法と最適化について説明しました。効率良いベクトル化なくして、インテル® Xeon Phi™ コプロセッサーのようなインテル® MIC アーキテクチャー上で優れたパフォーマンスを引き出すことはできません。次の点を理解することが不可欠です。
- -vec-report コンパイラー・オプションを使用して、アプリケーションのベクトル化できる領域、できない領域およびその理由を特定する。
- ベクトル化におけるデータのアライメントの重要性、およびデータのアライメントを強制する方法。
- ポインター・エイリアシングについて。また、複数のポインターが同じデータをエイリアスしていないことをコンパイラーに知らせる方法。
- 要素関数について。また、要素関数とインテル® Cilk™ Plus の配列表記 (アレイ・ノーテーション) がベクトル化を支援する方法。
さらに、ここでは、外部ループのベクトル化手法、ベクトル化された乱数生成、ロングベクトルとショートベクトルとの間のトレードオフについても説明しました。
次のステップ
この記事は、「Programming and Compiling for Intel® Many Integrated Core Architecture」(英語) の一部「Vectorization Essentials」の翻訳です。インテル® Xeon Phi™ コプロセッサー上にアプリケーションを移植し、チューニングを行うには、本ガイドの各リンクのトピックを参照してください。アプリケーションのパフォーマンスを最大限に引き出すために必要なステップを紹介しています。
「インテル® メニー・インテグレーテッド・コア (MIC) アーキテクチャー向けの高度な最適化」では、インテル® MIC アーキテクチャー上でパフォーマンスを最大限に引き出すための、いくつかの高度な最適化を紹介します。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。