[[PageNavi(NavigationList)]] ==== サンプリング機能を利用して問題個所と解決策を探る ==== VTuneのサンプリング機能は、プログラム実行時におけるCPUの挙動をサンプリングすることで、プログラムの挙動や発生している問題を調査するものだ。なお、サンプリング機能はCall Graph機能と同様にデバッグ情報がないプログラムについても調査が可能だが、プログラムのデバッグ情報およびソースコードがあるとソースコードレベルでホットスポットを調査でき、より調査がしやすくなる。デバッグ情報は「/Zi」コンパイルオプションを付けてプログラムをコンパイルすることで生成できる('''図7''')。Visual Studioの場合、プロジェクトのプロパティ中「C/C++」の「全般」でデバッグ情報の形式が指定できるので、「デバッグ情報の形式」として「プログラム・データベース(/Zi)」を指定すれば良い。 [[Thumb(b61b067fd6fa81a6b8ecee3686d54759.png, caption=図7 デバッグ情報の形式で「/Zi」を指定することでデバッグデータベースが作成される)]] サンプリング機能の設定および実行は、「Sampling Configuration Wizard」を利用すると良い。ツールバーの「File」-「New Project」を選択すると「New Project」画面が表示されるので、「Sampling Wizard」を選択して「OK」をクリックしよう('''図8''')。すると「Sampling Configuration Wizard」が表示されるので、'''図9~''''''図12'''のように条件を設定し、サンプリングを実行する。 [[Thumb(fc0231020b0159155af59ddf94d6c815.png, caption=図8 「New Project」画面から「Sampling Wizard」が呼び出せる)]] [[Thumb(3f6170cbabc6922a1bf1b8e5fe0673c5.png, caption=図9 「Select type of profiling」では「Windows*/Windows* CE/Linux* profiling」を選択し、「Tuning Assistance」の「Automatically generate tuning advice」にチェックを入れる。サンプリングを行う回数も指定できるが、通常は「Min」もしくは「Medium」を指定すればよいだろう)]] [[Thumb(d5e7ed34101791226d9736b8a05e7370.png, caption=図10 「Application to launch」で実行するプログラムを指定する。プログラムに渡す引数は「Command line arguments」で指定する)]] [[Thumb(7e10c233d79e86152c863ba0878da2f2.png, caption=図11 関数のシンボル情報を取得するモジュールを指定する。ここで測定したい関数を含むモジュールを追加しておく)]] [[Thumb(8262fc71e2d3f0e0fd9e570861e65855.png, caption=図12 「Sampling mechanism」は「Event-based using processor counters」を指定し、「完了」をクリックする)]] サンプリングの実行およびデータの収集・解析が完了すると、サンプリングされたプロセスが一覧表示されるとともに、「Intel Tuning Assistant」が表示される('''図13'''、'''図14''')。Intel Tuning Assistantで表示されている「CPU_CLK_UNHALTED.CORE」はCPUが処理した動作サイクル数で、今回は143,365,224,000サンプルが収集された、ということを示している。 [[Thumb(037db3744c0e6eae7944b60ddd51566b.png, caption=図13 サンプリング結果一覧の表示画面(プロセス))]] [[Thumb(fedb2e65025262e124d06292adb36bcf.png, caption=図14 パフォーマンス低下の原因を分析・表示する「Intel Tuning Assistant」)]] また、その下の「Other Possible Problem」ではパフォーマンス低下の原因と思われる項目が表示される。ここでは「CPI(Cycles Per retired Instruction)is poor」と表示されていた。その横には「1.58 clockticks per instructions retired」と表示があるが、この「clockticks per instructions retired」というのは、CPUがどれだけ「無駄な時間」を消費しているか、ということを表す指標だ。この値が大きいということは「キャッシュミス等が原因でCPUが処理を実行できない時間が多く存在した」ということを意味している。つまり、キャッシュミス等を改善すればアプリケーション全体のパフォーマンスを改善できる可能性がある、ということだ。そこで、続けてパフォーマンスが悪い個所の特定を行っていこう。 前述のとおり、VTuneではシステム全体に対してサンプリングを行うため、無関係なプロセスに関する情報も取得されている。ここで解析対象のプロセスをダブルクリックし、続けて対象スレッド、対象モジュールをダブルクリックで選択する('''図15~''''''図16''')。 [[Thumb(4716ff56e84db6c1e55a2b0d38ff21ac.png, caption=図15 サンプリング結果一覧の表示画面(スレッド))]] [[Thumb(0af1695653dd5b19b9a172aa21f69fcd.png, caption=図16 サンプリング結果一覧の表示画面(モジュール))]] モジュール一覧画面で解析したいモジュールをダブルクリックすると、'''図17'''のような「Hotspots」画面となり、関数ごとにその関数が消費したCPUサイクル(CPU_CLK_UNHALTED.CORE)やCPUが実行できた処理の数(INST_RETIRED.ANY)といった情報が一覧表示される。ここで、「clockticks per instructions retired」の列を見てみると、「!BlurImageChannel」という関数について「clockticks per instructions retired」の値が特に大きいことが分かる。 [[Thumb(712768239d6c09b4d39210b7fc41669a.png, caption=図17 Hotspots画面)]] [[PageNavi(NavigationList)]]