インテル® VTune™ Amplifier
Windows 環境向けスタートガイド
エクセルソフト株式会社
Version 1.0.0 - 20180829目次
1. インテル® VTune™ Amplifier の使用 . . . 1 2. インテル® VTune™ Amplifier の基本 . . . 1 3. サンプルプログラムを使用したチュートリアル . . . 2 3.1. プログラムのビルド. . . 3 3.2. インテル® VTune™ Amplifier の起動 . . . 5Visual Studio 統合環境から GUI を起動する. . . 5
スタンドアロンの GUI を起動する. . . 6 3.3. データ収集の開始. . . 9 3.4. ホットスポットの特定. . . 10 実行状況を大まかに把握する. . . 10 より詳細な情報を確認する. . . 12 3.5. コードの変更と性能向上の確認. . . 15 4. まとめ. . . 19 5. より高度な機能を使用するために. . . 19 6. ドキュメント. . . 19 7. 免責事項. . . 19
1. インテル® VTune™ Amplifier の使用
インテル® VTune™ Amplifier はインテル® プロセッサーへの最適化に特化したパフォーマンス・プロファイ ラーです。インテル® VTune™ Amplifier を使用することで、システム全体や、アプリケーションのボトルネッ クを素早く発見することができます。スレッドの効率やメモリーの帯域幅、キャッシュメモリーの利用率など、 性能向上にかかわる豊富な情報を収集して、効果的な最適化を支援します。 このドキュメントでは、インテル® VTune™ Amplifier の概要と、製品に含まれるサンプルプログラムを使用 して、以下の基本的な使用方法を説明します。 • インテル® VTune™ Amplifier の起動方法 • プロジェクトの作成、設定方法 • 解析結果の表示と、解析画面の見方 • ソースコードに掘り下げて解析結果を確認する方法 このドキュメントを進めていくためには、すでにインテル® VTune™ Amplifier がインストールされてい る環境が必要です。2. インテル® VTune™ Amplifier の基本
インテル® VTune™ Amplifier を最大限に活用するためには、前提としてインテル® プロセッサーを搭載し たシステムが対象です。プロセッサーに関する詳細な情報は、プロセッサー内部に搭載されているパフォーマ ンス・モニタリング・ユニット (PMU) からサンプリング・ドライバーを使用して取得します。PMU から情報を取 得できない環境でも、基本的な性能情報はインテル® VTune™ Amplifier から割り込みをかけて取得するこ とができます。また、インテル® VTune™ Amplifier は Java、C/C++、Fortran、.NET、Go、Python 言語に対応しており多く のアプリケーションの解析に使用できます。
3. サンプルプログラムを使用したチュートリアル
このドキュメントでは C++ 言語で記述された tachyon_vtune_amp_xe の find_hotspots を使用します。 インテル® VTune Amplifier をインストールすると、サンプルプログラムもあわせてインストールされるた め、別途ダウンロードする必要はありません。 find_hotspots は効率の悪い処理を実行している箇所がボトルネックとなり、性能が著しく低下しています。 インテル® VTune™ Amplifier で解析を行い、効率の悪い処理を発見して効果的な処理に置き換えます。 このガイドでは下記の環境で実行しています。環境により解析から得られるプログラムの性能特性が変化す る可能性があります。 • インテル® Core™ i7-7800X プロセッサー • 32GB メモリー• Microsoft Visual Studio* 2017 バージョン 15.8.1 (以下、Visual Studio) • Windows 10 Pro 64bit (バージョン 1803)
• インテル® VTune™ Amplifier 2018 Update3
3.1. プログラムのビルド
1. tachyon_vtune_amp_xe の配置先にアクセスして、対象のファイルを任意の場所に展開します。ここで はデスクトップに展開します。
サンプルプログラムの配置先
C:\Program Files (x86)\IntelSWTools\VTune
Amplifier\samples\en\C++\tachyon_vtune_amp_xe.zip
画像 1. tachyon_vtune_amp_xe の展開
2. tachyon_vtune_amp_xe フォルダ以下の tachyon_vtune_amp_xe.sln ファイルをダブルクリックしま す。サンプルプログラムには、Visual Studio 向けに tachyon_vtune_amp_xe.sln ファイルが各 vc フォ ルダに配置されています。 C:\<デスクトップ>\tachyon_vtune_amp_xe\tachyon\vc14\tachyon_vtune_amp_xe.sln 画像 2. tachyon_vtune_amp_xe.sln を開きます 3. 上部メニューから [ビルド] > [ソリューションのビルド] を選択してビルドを行い、実行ファイルを作成し ます。 画像 3. Visual Studio からビルド 4. ビルドしたサンプルプログラムを [デバッグ] > [デバッグなしで開始]から実行して、プログラムの実行時 間を確認します。
画像 4. デバッグなしで実行
画像 5. find_hotspots.exe の実行
描画処理を完了後、タイトルバーに実行に要した時間が表示されます。ここでは、約10秒ほどの時間をかけて 描画を行ったことが確認できます。10.656 秒の時間をベースラインとして、高速化できる余地があるかどう か、インテル® VTune™ Amplifier を使用して性能解析を実行します。
3.2. インテル® VTune™ Amplifier の起動
これまでの手続きにより、サンプルプログラムの描画時間を取得しました。インテル® VTune™ Amplifier で 性能解析を行い、実行時間を改善するために必要な情報を入手します。インテル® VTune™ Amplifier は Visual Studio 環境から、もしくはスタンドアロンの GUI を使用して操作します。
Visual Studio 統合環境から GUI を起動する もしくは スタンドアロンの GUI を起動する のいずれかを操作 して、インテル® VTune™ Amplifier を起動します。
Visual Studio 統合環境から GUI を起動する
上部メニューから のアイコンをクリックして、インテル® VTune™ Amplifier を起動します。
画像 6. Visual Studio 上部メニュー
クリックすると、Visual Studio 上でインテル® VTune™ Amplifier が起動して [New Amplifier Result] タブ が立ち上がります。
画像 7. Visual Studio 上のインテル® VTune™ Amplifier
スタンドアロンの GUI を起動する
スタートメニューを開き、VTune Amplifier <バージョン> をクリックする、もしくはコマンドプロンプトを開 き、amplxe-vars.bat を実行後、amplxe-gui コマンドを実行します。
デフォルトのインストール先では、amplxe-vars.bat ファイルは下記に配置されています。
C:\Program Files (x86)\IntelSWTools\VTune™ Amplifier\amplxe-vars.bat
画像 8. スタンドアロンの GUI を開始
スタンドアロン環境では、インテル® VTune™ Amplifier が管理するプロジェクトを作成します。解析対象ご とに一つのプロジェクトを作成して管理します。サンプルプログラムの tachyon を解析するために新規プロ ジェクトを作成しましょう。
1. をクリックして Create a Project ウィンドウを開き、Project name に任意のプロジェクト名を入力
します。ここでは、tachyon-sample とします。
画像 9. Create a Project ウィンドウ
2. Create Project ボタンをクリックします。続けて Analysis Target タブが開き、解析対象となるアプリ ケーションやシステムなどの設定を行います。
画像 10. Analysis Target タブ
3. ターゲットアプリケーションと作業ディレクトリを設定します。
をクリックして Application: と Working directory: に、それぞれサンプルプログラムの実行ファ イルと作業フォルダを指定します。
Application:*
C:\Users\xlsoftkk\Desktop\tachyon\vc14\find_hotspots_Win32_Release\find_hotsp ots.exe
Working directory:
C:\Users\xlsoftkk\Desktop\tachyon\vc14
画像 11. プロジェクト設定済みの状態
4. Choose Analysis をクリックして、解析タイプの設定に移ります。
3.3. データ収集の開始
ここまでの手続きにより、インテル® VTune™ Amplifier でサンプルプログラムが解析できる状態になりまし た。解析タイプを指定して、実際にインテル® VTune™ Amplifier で解析を実行します。
このドキュメントでは、解析タイプに Basic Hotspots を選択します。Basic Hotspots は一番時間を消費し ている関数 (ホットスポット)を発見する基本的な解析タイプです。 Basic Hotspots 以外にも、様々な解析タ イプがあり、それぞれ必要に応じて複数の解析タイプを実行することが可能です。得られた結果は記録され結 果ファイルとして保存します。
1. 解析タイプに Basic Hotspots を選択して Start ボタンをクリックします。
画像 12. 解析の開始
2. プログラムが実行され、インテル® VTune™ Amlifier が自動的にデータ収集を開始します。プログラムの 実行が終了して解析結果が表示されるまで待機します。
画像 13. インテル® VTune™ Amplifier による tachyon の解析
3.4. ホットスポットの特定
インテル® VTune™ Amplifier の解析結果は、複数の画面を参照しつつ、用途に応じて異なる視点から解析情 報を提供します。Basic Hotspots解析では下記の5つの画面に解析情報が表示されます。使用した解析タイ プにより表示される内容は異なります。ここでは Summary と Bottom-up に注目します。 • Summary • Bottom-up • Coller/Collee • Top-down Tree • Platform 実行状況を大まかに把握する 解析結果を開くと、Summary 画面が最初に表示されます。Summary 画面では、アプリケーションの実行時 間や、ホットスポット、CPU 使用率のヒストグラムから、アプリケーションの実行状況をおおまかに把握する ことができます。 画像 14. Summary 画面 Elapsed Time にはアプリケーションの実行から終了までに要した時間が表示されます。サンプルプログラ ムでは、描画後に待機時間が設けられているため、プログラムのビルド でベースタイムに設定した時間より も長くなっていることに注意してください。Top Hotspots はアプリケーション中に実行された関数の中から、最も多くの CPU 時間を消費した関数を
Summary 画面から下記の情報を取得できます。 • プログラム全体の実行時間は約 19 秒 • 実行時間中の CPU 時間は約 14.5 秒 • ホットスポットは render_one_pixel 関数 • 3つのスレッドが動作している • プログラム中の多くの処理は 1 スレッドで動作しており並列に実行されていない ここでは、ホットスポット関数として表示されている render_one_pixel 関数に注目するため、より詳細な情 報が得られる Bottom-up 画面に移動します。 画像 15. Bottom-up 画面に移動
より詳細な情報を確認する Bottom-up 画面はBottom-up、タイムライン、コールスタックの3つのペインで構成されています。ここで は、Bottom-up とタイムラインの情報に注目します。 • Bottom-up : 実行された関数やループ、モジュールごとに対応した性能情報を表示します。 • タイムライン : 解析開始から終了までに実行されたスレッド数とスレッドの状態を時系列で表示します。 • コールスタック : Bottom-up で選択したオブジェクトのコールスタックを表示します。 画像 16. Bottom-up 画面
Bottom-up を見ると、CPU Time の項目で降順にソートされており、Summary 画面で確認した情報と同じ く render_one_pixel 関数が一番 CPU 時間を消費していることが確認できます。render_one_pixel 関数 は、解析対象のプログラム find_hotspots.exe に含まれるユーザー関数です。
render_one_pixel 関数の実行状況をより詳しく把握するために、フィルタリング機能を使用して注目しまし ょう。 Bottom-up に表示されている render_one_pixel を右クリックして、表示されるメニューから Filter
In by Selection を選択します。
タイムラインから対象の関数が実行されたタイミングや、スレッドの動作状況を確認できます。タイムライン に表示される茶色の領域は CPU 時間に対応しています。 画像 18. フィルタリング結果 タイムラインから render_one_pixel 関数は CPU のリソースを効果的に使用できていない状態が確認でき ます。カーソルをタイムラインに重ねると数値情報を得られます。 画像 19. CPU 利用率は低い フィルター機能は、 をクリックして解除できます。 ソースコード行のレベルに掘り下げて解析結果を確認します。 render_one_pixel をダブルクリックしてコー ドビューに移動します。Bottom-up 画面には、関数に対応したソースファイルが項目に表示されます。 render_one_pixel 関数は find_hotspots.cpp に記述されています。 画像 20. render_one_pixel のコードビューに移動
コードビューでは、対応した関数をコードレベルで確認できます。ここでは、find_hotspots.cpp ファイルが開 かれ、render_one_pixel 関数のコードがハイライトされます。コードに対応した性能情報が表示されており、 注目するべきは、 render_one_pixel 関数が消費している CPU 時間の 98% が、関数内部でコールしている initialize_2D_buffer 関数によって発生していることです。 画像 21. find_hotspots.cpp のコードビュー initialize_2D_buffer 関数は、コンパイラーのインライン展開などの理由により、関数情報としてインテル® VTune™ Amplifier に表示されていません。 Visual Studio のテキストエディターから initialize_2D_buffer の処理を確認します。コードビューのいずれかのコード領域をダブルクリックして Visual Studio に移動しま す。
Bottom-up 画面とコードビューから下記の情報を取得しました。 • render_one_pixel 関数は find_hotspots.exe のユーザー関数
• render_one_pixel 関数は一番 CPU 時間を消費して動作しているが、CPU 利用率が悪い
• render_one_pixel の CPU 時間のほとんどは、内部でコールしている initialize_2D_buffer 関数が消
費している
3.5. コードの変更と性能向上の確認
いままでの手続きにより、render_one_pixel 関数でコールされている initialize_2D_buffer 関数が多くの 時間を消費していることが確認できました。initialize_2D_buffer 関数の実装を変更して性能向上を図りま す。
1. render_one_pixel 関数でコールされている initialize_2D_buffer 関数 (find_hotspots.cpp : 133 行 目) を右クリックします。 2. [定義へ移動] をクリックします。 画像 22. initialize_2D_buffer の定義に移動 3. initialize_2D_buffer 関数の定義に移動して内部実装を下記のように変更します。 ◦ 78 行目の末尾にある / を削除 ◦ 91 行目の末尾に / を追加 initialize_2D_buffer 関数は、メモリーに対して非連続にアクセスしており、効率の悪い配列の初 期化処理が実行されています。連続したアクセスを行う実装がコメントアウトされているので置き換 えます。
変更後の find_hotspots.cpp
void initialize_2D_buffer (unsignedint mem_array [], unsignedint *fill_value) {
// First (slower) method of filling array
// Array is NOT filled in consecutive memory address order /***********************************
for (int i = 0; i < mem_array_i_max; i++) {
// Try to defeat hardware prefetching by varying the stride int j(0), iteration_count(0);
do {
mem_array [j*mem_array_i_max+i] = *fill_value + 2;
// Code to give the array accesses a non-uniform stride to defeat hardware prefetch if ((iteration_count % 3) == 0) j=j+3; else j=iteration_count; iteration_count++; } while (j < mem_array_j_max); } /***********************************/
// Faster method of filling array // The for loops are interchanged
// Array IS filled in consecutive memory address order /**********************************/
for (int j = 0; j < mem_array_j_max; j++) {
for (int i = 0; i < mem_array_i_max; i++) {
mem_array [j*mem_array_i_max+i] = *fill_value + 2; } } /***********************************/ } 置き換えた状態でビルドをやり直して、再度実行します。 4. 上部メニューから [ビルド] > [ find_hotspotsのビルド] を選択してビルドを行い、実行ファイルを作成し ます。
画像 23. プロジェクトのビルド
5. ビルドしたサンプルプログラムを [デバッグ] > [デバッグなしで開始]から実行して、描画時間を確認しま す。
画像 24. プログラムの実行
画像 25. 実行性能が向上したプログラム
描画時間は高速化して4秒程度にまで短縮しました。最適化を行う前にベースラインとして計測した 10.656 秒と比較した場合、約 2.5 倍ほどの性能向上が得られました。インテル® VTne Amplifier で解析すると下記 のような結果が得られます。
画像 26. インテル® VTune™ Amplifier の結果
4. まとめ
このドキュメントでは、インテル® VTune™ Amplifier を使用して、基本的な使用方法からサンプルプログラ ムのホットスポットを発見して修正する手続きを紹介しました。インテル® VTune Amplifier には、性能解析 に必要な様々な機能を備えており、ここではごく一部の機能について説明しています。より高度な機能を取得 するためには、 より高度な機能を使用するために から他のチュートリアルも進めてみてください。5. より高度な機能を使用するために
ドキュメントで使用した tachyon プログラムには、異なるチュートリアルの analyze_locks が含まれてお り、マルチスレッド化されたプログラムのボトルネックを発見する手続きの一例を学習することができます。 analyze_locks のチュートリアルは下記の資料から進めることができます。Tutorial: Analyzing Locks and Waits (英語)
また、ハードウェア・イベントに関わる性能解析を学習するためには、下記の Intel 社 Web ページに公開され ている各チュートリアルが参考になります。
Intel Developer Zone - Intel® VTune™ Amplifier Tutorials (英語)
6. ドキュメント
インテル® VTune™ Amplifier の日本語情報は IA Software User Society (以下、iSUS) に公開されている 下記のリンク先からアクセスできます。
iSUS - インテル® VTune™ Amplifier 2018 製品ページ
インテル® VTune™ Amplifier 2018 のリファレンスガイドには日本語参考訳を見ることができます。 iSUS - インテル® VTune™ Amplifier 2018 オンラインヘルプ (iSUS 翻訳版)
Intel Developer Zone - Intel® VTune™ Amplifier 2018 User’s Guide
7. 免責事項
Intel、インテル、Intelロゴ、VTune は、アメリカ合衆国および/またはその他の国における Intel Corporation の商標です。 *その他の社名、製品名などは、一般に各社の商標または登録商標です。 XLsoftロゴ、XLsoft は XLsoft Corporation の商標です。
インテル® ソフトウェア製品のパフォーマンス / 最適化に関する詳細は、 Optimization Notice (最適化に関 する注意事項) を参照してください。