HPC/並列プログラミングポータルでは、HPC(High Performance Computing)プログラミングや並列プログラミングに関する情報を集積・発信しています。

新着トピックス

サンプリング機能を利用して問題個所と解決策を探る

 VTuneのサンプリング機能は、プログラム実行時におけるCPUの挙動をサンプリングすることで、プログラムの挙動や発生している問題を調査するものだ。なお、サンプリング機能はCall Graph機能と同様にデバッグ情報がないプログラムについても調査が可能だが、プログラムのデバッグ情報およびソースコードがあるとソースコードレベルでホットスポットを調査でき、より調査がしやすくなる。デバッグ情報は「/Zi」コンパイルオプションを付けてプログラムをコンパイルすることで生成できる(図7)。Visual Studioの場合、プロジェクトのプロパティ中「C/C++」の「全般」でデバッグ情報の形式が指定できるので、「デバッグ情報の形式」として「プログラム・データベース(/Zi)」を指定すれば良い。

 サンプリング機能の設定および実行は、「Sampling Configuration Wizard」を利用すると良い。ツールバーの「File」-「New Project」を選択すると「New Project」画面が表示されるので、「Sampling Wizard」を選択して「OK」をクリックしよう(図8)。すると「Sampling Configuration Wizard」が表示されるので、図9~12のように条件を設定し、サンプリングを実行する。

 サンプリングの実行およびデータの収集・解析が完了すると、サンプリングされたプロセスが一覧表示されるとともに、「Intel Tuning Assistant」が表示される(図13図14)。Intel Tuning Assistantで表示されている「CPU_CLK_UNHALTED.CORE」はCPUが処理した動作サイクル数で、今回は143,365,224,000サンプルが収集された、ということを示している。

 また、その下の「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)。

 モジュール一覧画面で解析したいモジュールをダブルクリックすると、図17のような「Hotspots」画面となり、関数ごとにその関数が消費したCPUサイクル(CPU_CLK_UNHALTED.CORE)やCPUが実行できた処理の数(INST_RETIRED.ANY)といった情報が一覧表示される。ここで、「clockticks per instructions retired」の列を見てみると、「BlurImageChannel」という関数について「clockticks per instructions retired」の値が特に大きいことが分かる。