ハイパースレッディング周りの注意点
パフォーマンスの定義に続き、菅原氏は、インテルのマイクロアーキテクチャー『Nehalem』を使ったXeon5500シリーズの特徴を解説した。5500シリーズのチップセットは、デュアルソケットで各ソケット4コア、ハイパースレッディングをオンにすると、16の論理スレッドが扱える。ここで菅原氏は「パフォーマンスを見る上で、ハイパースレッディングは1つの物理的なスレッドを論理的に2つにしているため、性能が倍になるとは限りません。チューニングするには、ハイパースレッディングをオフにすることをおすすめします。同様に、CPUに余力があるときにコアの周波数を動的に向上させるターボ・ブースト・テクノロジーもオフにします。これは、チューニングの際の解釈が難しくなるためです。最適化を行ったあとに、あらためてこれらの機能を有効にして分析します」と注意点を強調した。
このあと菅原氏は、8つの物理コアで実行する8スレッドでの処理と、4つの物理コア上に展開した8つの論理コアで実行する8スレッドでの比較を提示。同じ8スレッドであるが、前者ではクロックが2843億でイテレーションのサイクルが2.2、後者ではクロックが5849億でイテレーションのサイクルが4.5と大きな違いがあることを示し、続いてツールによる分析手法の解説を行った。
VTune パフォーマンス・アナライザーによる分析
「VTune パフォーマンス・アナライザー」は、アプリケーションごとにイベントを数種類同時に収集でき、ボトルネックをすばやく検知するため、アプリケーションレベルだけでなく、関数レベル、ソースコードレベルでのチェックも可能だ。菅原氏は、ソースコードの分析画面の例を示し、クロックのカウント数がコードのどこにいくつあるかや、終了した命令がどれだけのクロックを費やしたのかなどの数値を説明した。なお、ツールが情報を収集する際クロックごとにパフォーマンス情報を取得するように設定してしまうとパフォーマンスに影響を与えるので、数億回、あるいは数万回に1回の割合で情報を取得するように設定する。
続いて、クロックの合計カウント数(1つの要素命令の実行に費やしたサイクル数+メモリの読み込みや事前の処理の終了待ちなどでストールされたサイクル数の合計)を表示できる「ホットスポット」ビュー画面を示し、この数値が多い処理ほど最適化の対象となると説明した。さらに、問題となる処理がどこで発生しているかどうかを知るために、処理の流れを時系列で並べた画面も紹介した。また、関数レベルでの分析を行うため、関数どうしの呼び出し回数や処理時間を確認できるコールグラフの画面も提示した。これらの機能により、スレッド化をより最適化するためのポイントが分かるようになる。
ある程度最適化が進むと、特定の部分だけ集中してチューニングしたいという要求も出てくる。VTuneAPIをインクルードすると、データの記録を再開するレジュームや、記録を停止するポーズが可能になる。これにより、収集するデータ量を最小限にすることができ、分析の時間を短縮できる。加えて菅原氏は、「VTune パフォーマンス・アナライザー 9.1」の新機能として、サポートされていないOSや実行時にコードを生成するタイプのアプリケーション、JavaScriptやActionScriptといったスクリプト言語のサポートなどを解説した。
アプリケーションがもっとも時間を消費する場所を「hotspot」といい、最適化の労力はこのhotspotを対象に行われる。それを可能にするのが、VTune パフォーマンス・アナライザーのサンプリング・ウィザード。菅原氏は、先に挙げた物理的な8コアでの8スレッドと、論理コア8つでの8スレッドの例を再提示し、同ツールでの分析結果を説明した。VTune パフォーマンス・アナライザーでは、ストールされたサイクル数も明示され、OSレベルでの分析と比較した場合の数値とも比較して、アプリケーションのみを的確に発見できることが示された。
スレッド・プロファイラーとスレッド・チェッカー
また、スレッドに均等に負荷をかけないと、処理の長くかかったスレッドの影響で全体の終了時間が伸びてしまう。菅原氏は、このような効率のよくないスレッド(ロード・インバランス)の問題を指摘できるツール「スレッド・プロファイラー」の分析画面も紹介した。
最後に紹介したツールは「スレッド・チェッカー」。これはデッドロックやデータの競合などの問題を検出するもので、Parallel StudioのParallel Inspectorとほぼ同じ機能を提供する。このツールの注意点としては、コード単位でチェックするため、なるべく多くのコードを検証するためのパターンを用意しておくテストケースの準備が必要とした。
菅原氏は、まとめとして「アーキテクチャー分析」「スレッド導入/最適化」「デバッグなどによる信頼性」「最適化/チューニング」といったパフォーマンスの最適化の段階において、各種のツールを効率よく使うことが開発を簡単にすると改めて強調し、講演を締めくくった。