最近のプロセッサーでは、ベクトル化とスレッド化を行ったコードは非常に高速に実行できます。しかし、コードがベクトル化できない理由を理解することは容易ではありません。
インテル® Advisor は、C、C++、C#、Fortran ソフトウェア・アーキテクト向けの高性能ベクトル化/スレッド化プロトタイプ生成ツールです。ベクトル化を安全かつ効率的に行えるように、反復回数、データ依存性、メモリー・アクセス・パターンなどの必要なキーデータを取得します。インテル® AVX-512 対応ハードウェアがない場合でも、最新のインテル® AVX-512 命令セット向けの最適化を行えます。さらに、スレッドのプロトタイプ生成を利用することで、進行中の開発に影響を与えることなく、設計オプションを素早く評価できます。
詳細・新機能 技術情報インテル® Advisor は単体で販売されておりません。以下製品に同梱されます。
主に以下の変更・機能が追加されました。
詳細は、 リリースノートおよび インテル社公開の情報を参照ください。
プロセッサーが進化するにつれ、プロセッサーの性能を最大限に引き出すには、ソフトウェアのベクトル化 (インテル® AVX やインテル® SIMD 命令を使用) とスレッド化がますます重要になってきています。
ある例では、ベクトル化とスレッド化が実装されたコードは、ベクトル化とスレッド化が未実装のコードよりも 187 倍も高速化し、スレッド化もしくはベクトル化のどちらか一方が実装された場合よりもおよそ 7 倍高速化されました。このように、ベクトル化とスレッド化されたコードとされていないコードの性能差は、新しいプロセッサーの世代ごとに広まってきています。
適切な設計方法を選択するには、正確かつ豊富なデータが必要です。どのループを最初にベクトル化およびスレッド化すべきでしょう? 労力に対して十分なパフォーマンスは得られますか? スレッドのパフォーマンスはコア数に応じてスケールしますか? ループにはベクトル化を妨げる依存性がありますか? ループの回数とメモリーアクセスのパターンは? 最新のインテル® AVX2 で効率良くベクトル化できるか、もしくは以前のインテル® SIMD 命令を使うべきか?
インテル® Advisor は、ベクトル化とスレッド化の適切な設計と意思決定に必要なデータやヒントを、素早く簡単に得るためのワークフローを提供します。C/C++、C# および Fortran コードをサポートし、最適化コストの増加と実装を中断させることなく、異なる種類のスレッド化設計によるパフォーマンスのスケーリングを比較し、即座にモデル化できます。インテル ® Advisor で適切な設計を行った後の実装では、スレッド化によるバグを気にすることなく、またいつでもスレッド化を削除できるため、コードの設計段階でコードを単一に保つことができます。
修正が容易な開発の設計段階で、事前にデータ共有の問題を検出し解決します。同期を追加した際のパフォーマンスへの影響と、より多くのコアを搭載するシステムでのスケーリングをモデル化し確認できます。
既存のベクトル化済みのコードをチューニングして、さらに新しいベクトル化を容易に追加できます。潜在的なパフォーマンス向上の可能性で、各ループをソートすることで、ソースに対するコンパイラーのレポートを解釈しやすくなり、効率良いベクトル化のヒントが得られます。また、ベクトル化を安全にかつ効率良く行うために、ループカウント、データ依存性そしてメモリーのアクセスパターンなど重要なデータを確認できます。
まずはアプリケーションの中から、並列化によってパフォーマンスを向上できる箇所を探すことから始めます。これは、スレッド化とベクトル化の両方で最初のステップとなります – 最も影響のある変更箇所を探します。
すべてのループの Survey Summary (調査結果の一覧) 推奨を見るにはハイライトされたバルブマークをクリックします (次の図)。コンパイラーのメッセージとともにソースを見るにはループをダブルクリックします (その次の図)。
キャッシュ対応ルーフライン
調査ターゲット、トリップ数、および 1 秒あたりの浮動小数点演算(FLOPS) を実行すると、キャッシュを認識するルーフラインのグラフが表示されます。
「キャッシュ対応ルーフライン」を使用して、ボトルネックの原因となる可能性のあるパフォーマンスの低下したループと、各ループのパフォーマンス「ヘッドルーム」
を特定します。
ルーフライン・ダイアグラムの「Roofs (ルーフ)」には、プラットフォームのメモリー、キャッシュ、計算の制限が表示されます。
ドットはループを表します。 最適化すれば、赤いドットが大きくなるほど時間がかかります。
ルーフから遠い点には改善のための「ヘッドルーム」があります
この図では、A および G が最良の候補、B は改善の余地があるが影響は少ない候補、E、C、D、H は改善の余地が見込めない候補です。
サーベイレポートには、コンパイラーが依存性を想定したためベクトル化されなかったループの影響が示されます。チェックボックスにチェックを入れて、依存関係のチェックを行います。チェックの結果、実際に依存関係が検出されなかった場合、ソースにプラグマを挿入してコンパイラーにループをベクトル化しても良いことを知らせます。
連続するゼロユニット・ストライドのベクトル化は最も高効率です。しかし、ループ中で間接参照が行われている場合、開発者 (とコンパイラー) はベクトル化の可能性を判断できない可能性があります。チェックボックスにチェックを入れ、メモリーアクセスが均一であることを確認するため、メモリー・アクセス・パターン解析を行います。均一であれば、#pragma omp を使用して関数をベクトル化できます。パフォーマンスの改善をチェックするため、調査を再実行します。
メモリー・アクセス・パターン解析は、プラグマを挿入することで容易にベクトル化が可能なメモリーのストライドアクセスをチェックできます。
インテル® Advisor の解析によって並列性の可能性を簡単に見出せるようにするために、ソースコードにアノテーション (注釈) を挿入します。コンパイラーは、挿入したアノテーションを無視します。アノテーションは、設計をモデル化するためインテル® Advisor のみによって使用されます。これにより、シリアルコードのまますべてのテストケースを実行できるため、設計段階でスレッドのバグを洗い出すことが可能になります。
アノテーションによりアプリケーションのスレッド化の設計を記述し、インテル® Advisor がスケーラビリティーを解析して依存性エラーを検出します。アノテーションはコンパイラーによって無視されるため、開発を中断することなく設計を評価できます。
インテル® Advisor は、オープンで業界標準の並列プログラミング・モデルを選択できます。OpenMP* は、既存のコードと互換性があります。
インテル® スレッディング・ビルディング・ブロック (インテル® TBB) は、豊富な抽象化機能を提供します。 Microsoft* TPL は、C# 向けに設計されています。
言語 | 並列プログラミング・モデル |
---|---|
C/C++ |
|
C# |
|
Fortran |
|
インテル® Advisor が、アプリケーションを自動的にスレッド化し高速に実行できるようにできれば理想的ですが、残念ながらそれを実現するための技術は、現在の技術水準を超えていると言わざるを得ません。インテル® Advisor は、ソフトウェア設計者や開発者のためのツールです。このツールは解析を自動化し、開発者が効率良く既存のアプリケーションをスレッド化するために必要な情報を提供します。
設計プロセスを繰り返すことで、簡単に代替案とトレードオフを調査できます。インテル® Advisor は、正確なパフォーマンスの予測と同期エラーを事前に特定することで、優れた設計に向けた意思決定を支援します。コストのかかる設計ミスを回避しつつ、より高速な並列化による性能向上を達成できます。
インテル® Advisor を使うことで、スレッドの設計、パフォーマンス予測、エラー解析を通常の開発作業と並行して進めることができるようになります。アノテーションは、インテル® Advisor に、高いパフォーマンスと正当性を得るための設計方針を開発者にアドバイスするために使用されますが、コンパイルされたコードには影響しません。これにより、並列化の設計を行いながら製品版の開発や更新を継続できます。すべてのテストケースで作業を続行できます。並列処理を実際に実装する前に、アプリケーションが安定して正しく動作することを確認しましょう。
インテル® Parallel Studio XE 製品には、インテル® TBB などの並列プログラミングの生産性を高めるコンポーネント、機能が含まれています。拡張性と信頼性が高い生産的な並列プログラミング・モデルによって、数行のコード追加・変更で並列処理を実装します。タスクベースのアルゴリズム、コンテナー、同期プリミティブは、並列アプリケーションの開発を容易にします。インテル® TBB のタスクベースのスケジューラは、タスクをスレッドに動的にマップすることで、ロードバランシングが行われ、キャッシュの局所性と高め、パフォーマンスを向上させます。これにより、管理しやすい少ないコードによって、高いパフォーマンスをいち早く実現できます。
プロセッサー |
インテル® プロセッサー、コプロセッサーおよび互換プロセッサー |
オペレーティング・システム |
オフロード・アドバイザーのパフォーマンス予測は、以下の OS でサポートされます。
GPU ルーフライン解析は、以下の OS でサポートされます。
|
開発環境 |
スタンドアロンまたは下記の Microsoft* Visual Studio* 統合環境 (Windows*)。
|
言語 |
C、C++、Fortran |
コンパイラー |
以下のインテル® コンパイラー、そのほか標準に準拠するコンパイラーで動作します。いくつかの機能は、インテル® コンパイラーでよりうまく働きます (より詳しいベクトル化のアドバイスなど)。
|
スレッド化モデル |
以下のインテル® コンパイラー、そのほか標準に準拠するコンパイラーで動作します。いくつかの機能は、インテル® コンパイラーでよりうまく働きます (より詳しいベクトル化のアドバイスなど)。
|
RAM |
2GB |
ディスク空き容量 |
650MB (すべての機能をインストールする場合) |
2023年11月24日、インテル® Advisor 2024 が同梱されるインテル® ソフトウェア開発ツールに対応する有償サポートサービスの提供を開始しました。
過去に製品をご購入いただき、現在有効なサポートサービスをお持ちのお客様は、すぐにバージョン 2024 を無料でダウンロードしてご利用いただけます。
2022年12月19日、インテル® Advisor 2023 が同梱されるインテル® oneAPI 2023 の販売を開始しました。
過去に製品をご購入いただき、現在有効なサポートサービスをお持ちのお客様は、すぐにバージョン 2023 を無料でダウンロードしてご利用いただけます。
2021年 12月 23日、インテル® Advisor 2022 が同梱されるインテル® oneAPI 2022 の販売を開始しました。
過去に製品をご購入いただき、現在有効なサポートサービスをお持ちのお客様は、すぐにバージョン 2022 を無料でダウンロードしてご利用いただけます。
2020年 12月 9日、インテル® Advisor 2021 が同梱されるインテル® oneAPI 2021 の販売を開始しました。
過去に製品をご購入いただき、現在有効なサポートサービスをお持ちのお客様は、すぐにバージョン 2021 を無料でダウンロードしてご利用いただけます。
2019年 12月 18日、インテル® Advisor 2020 が同梱されるインテル® Parallel Studio XE 2020 の販売を開始しました。
過去に製品をご購入いただき、現在有効なサポートサービスをお持ちのお客様は、すぐにバージョン 2020 を無料でダウンロードしてご利用いただけます。
インテル® System Studio は、システム/IoT デバイス・アプリケーションのパフォーマンス、電力効率、信頼性向上を支援するソフトウェア開発ツールです。
2018年
10月 3日にリリースされたインテル® System Studio のバージョン 2019 より、Professional Edition 以上に新たにインテル®
Advisor が同梱されます。
インテル® System Studio の製品詳細はこちら。
2018年 9月 13日、インテル® Advisor 2019 が同梱されるインテル® Parallel Studio XE 2019 の販売を開始しました。
過去に製品をご購入いただき、現在有効なサポートサービスをお持ちのお客様は、すぐにバージョン 2019 を無料でダウンロードしてご利用いただけます。
iSUS では、皆様のご要望にお応えして、インテル® Advisor 2019 for Windows* Initial Release および Update 1 の日本語版を提供しています。日本語版では、GUI/CLI メッセージ、およびヘルプやドキュメント類が日本語化されています。こちらの iSUS のページからお申し込みいただけます。
インテル® Advisor は、最新のプロセッサーの並列パフォーマンスを向上するソフトウェア・アーキテクトや開発者向けのツールのセットです。次のように開発者を支援します。
はい。ベクトル化アドバイザーには SIMD 命令の非効率的な利用を検出するさまざまな機能が用意されています。典型的な例をいくつか示します。
ベクトル化アドバイザーには次のような機能があります。
いいえ。インテル® Advisor は、コードを安心して効率的に並列化できるように支援します。
いいえ。ただし、インテル® コンパイラーを使用すると、特定のベクトル化アドバイスなどの機能が追加されます。
インテル® Advisor は、並列化 (ベクトル化およびスレッド化) に適したコード領域を識別できるように支援します。また、コード領域を並列化することが適切かどうか判断できるように支援します。多くのユーザーは、この機能を最も大きな利点の 1 つとして挙げています。適切な予測により、最も効果のある場所に開発を集中することができます。もちろん、プロファイラーを使用して手動で決定することもできます。しかし、インテル® Advisor は、大量のコアにおけるスケーラビリティーを予測し、同期のコストをモデル化して、同期エラーを検出できます。そのため、少ない労力で適切な予測を行うことができるのです。
インテル® Advisor には遅延実装ワークフローによるさまざまな利点があるためです。
はい。インテル® Xeon Phi™プロセッサーのパフォーマンスを引き出すには、効率的なスレッド化とベクトル化が非常に重要です。インテル® Advisor は、インテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) をサポートするプロセッサーが搭載されている場合でも搭載されていない場合でも、インテル® AVX-512 向けのベクトル化を最適化するために使用できます。
はい。インテル® Advisor は現時点では MPI 並列処理に対応していませんが、スレッドレベルの並列処理を MPI アプリケーションに追加することはできます。インテル® Advisor は、シリアルコードを解析して、並列化による最適化方法を理解できるように支援することを目指しています。MPI プログラムの各ランクは実際にはシリアル・アプリケーションです。そのため、インテル® Advisor を使用することで、並列化の可能性を判断することができます。インテル® Advisor は、MPI API の使用状況を解析しません。基本的に無視します。MPI プログラムでインテル ® Advisor を使用するには、MPI API 呼び出し間のシーケンシャル・コードに、ほかのシリアル・コード・セクションと同じようにアノテーションを追加します。次に、mpirun コマンドを使用して advixe-cl コマンドライン・ツールを起動します。advixe-cl コマンドが適用される各 MPI ランクが個々の出力結果を生成します。この出力結果をホストマシンに手動でコピーした後、advixe-guia を使用して結果を表示できます。
いいえ。インテル® Advisor はメモリー帯域幅やキャッシュの動作をモデル化しません。インテル® Advisor は、シリアル・アプリケーションを並列アプリケーションに再構成するため、シリアル・アプリケーションの構造と動作を理解できるように支援する最初のツールです。このプロセスは複数のステップからなります。適切な結果を得るには、すべてのステップを行う必要があります。最初に、インテル® Advisor を使用して、いくつかのステップを行います。その後、インテル® VTune™Amplifier およびインテル® Inspector を使用して、残りのステップを行います。 実用的な並列プログラムでは、パフォーマンス目標を達成するために並列で実行する計算量を識別する必要があります。
パフォーマンスと正当性の両方を満たす、アノテーションで表現された並列実行のモデルが用意できれば、並列フレームワークで表現することができます。並列フレームワークを利用するように再構成されたコードは、シリアル・アプリケーションではなくなります。この処理には、インテル® Advisor を使用します。この時点で、インテル® VTune™Amplifier を使用して、新しく記述されたアプリケーションを評価し、実際の並列ハードウェアにどのようにマップされるか確認します (メモリー帯域幅およびキャッシュサイズ効果を含む)。また、インテル ® Inspector を使用して、緩和シーケンシャル実行で厳密に定義されたモデルでは存在しない正当性問題と同期問題を評価します。
インテル® Advisor はシリアルコードをモデル化します。シリアル・アプリケーションでも、並列アプリケーションでも、実行されるコードの大半はシリアルです。例えば、マルチスレッドのアプリケーションでは、各スレッドはシリアルプログラムと同じです。インテル® Advisor は、これらの「同時」実行スレッドを個別のシリアル解析に分けます。 通常、インテル® Advisor を使用する前に、アプリケーションの明示的な並列化を無効にしておくと良いでしょう。この場合、スレッド数を 1 に設定して、既存の並列化されているコードを 1 つの実行スレッドにマップします。 この処理を行うことができれば、そのプログラムはシリアルです。次に、インテル® Advisor を使用してまだ並列化されていない新しいコード領域を識別します。それは 2 つのすでに並列化されている領域間のシリアルコード領域かもしれません。あるいは、すでに並列化されている領域に別のレベルの並列処理を追加している、階層的並列処理かもしれません。例えば、関数の内部ループを並列化した後、外部ループを並列化することで関数のスケーラビリティーが向上することに気付くこともあります。
いいえ。インテル® Advisor はすでに並列化されている領域をモデル化しません。プログラムがすでに並列化されている可能性を考慮せず、各シーケンシャル実行スレッドを別々に扱います。
いいえ。しかし、インテル® Advisor は、取得した情報を使用してスケジューリングと同期のオーバーヘッドを推定します。インテル® Advisor の仕事は、再構成終了後の最終的な並列プログラムのパフォーマンスを正確に予測することではありません。インテル® Advisor の目的は、効果的な並列プログラムを作成するためのパスに沿って開発者をガイドし、開発者が適切な判断を下せるように支援することです。具体的には、インテル® Advisor は常にヒューリスティックを使用して、仮定を現実的なものへ単純化します。適合性のため、クリティカルな部分 (通常は大きなタスク) のみに注目するようにタスク構造を変更し、統計を使用して小さなタスクをモデル化します。そして、正しい処理を行っているかどうか知らせるため、並列マシンの理論的な「理想」モデルを使用してプログラムの迅速な評価を行います。
インテル® Advisor のモデル化言語の利点は、完全に正しい並列アプリケーションを表現するための要件が並列フレームワークよりも単純なことです。段階的にアノテーションを使用できるため、一度にすべてのことを行う必要はありません。不完全で正しくない並列モデルから開始しても、完全で正しくなるまで時間をかけて改良できます。インテル® Advisor では、インテル® TBB で必要とされる広範な再構成は不要です。適切なソリューションが提案されたと確信できるまで再構成を遅らせることにより、アプリケーションに最適なソリューションを選択する前に、さまざまなソリューションを調査することができます。アノテーションはコードの設計をインテル® Advisor に示しますが、コンパイルされたコードは変更しません。そのため、並列処理の設計中に製品アップデートを継続してリリースできます。また、すべてのテストケースを継続して使用できます。最終ステップ (並列処理の実装) に移る前に、アプリケーションが安定して正しく動作することを確認します。
いいえ。これは自動コード再構成の良い研究対象になるでしょう。インテル® Advisor の目的は、解析を自動化して開発者が生産的に並列化を行えるように支援することです。いずれはすべての処理を自動化したいと考えていますが、現時点では開発者が行ったほうが適切な処理がまだいくつかあります。
通常、最高レベルの解析ではアプリケーションの実行コードパスに存在するメモリーエラーやスレッド化エラーが発見されますが、インテル® Advisor がプログラムのスレッド化エラーをすべて発見できるという保証はありません。
いいえ。解析関連のコード/データはランタイムにプログラムのアドレス空間に追加されます。
いいえ。現時点ではインテル® Advisor はプロセスのアタッチやデタッチはサポートしていません。プロセスのマルチスレッド・バグを検出するには、インテル® Advisor がプログラムの開始時点から同期イベントと関連するアノテーションを監視する必要があります。もちろん、解析を開始した後、いつでもインテル® Advisor を手動で停止できます。
インテル® レジストレーション・センターで操作します。
操作手順やよくあるご質問、トラブルシューティングは、インテル
® レジストレーション・センター操作マニュアルを参照ください。
最新版、または旧バージョンのダウンロードは、インテル® レジストレーション・センターで行います。
詳細は以下ページを参照ください。