米インテル社およびインテル株式会社は、C/C++開発者を対象としたイベント「インテル ソフトウェア・カンファレンス」を2009年10月2日に開催した。同イベントでは、並列化を通じてプロセッサーコアの性能を活用するという課題を挙げ、並列コンピューティングを実現する最新の開発ツールや開発手法、今後のインテル製品のロードマップが紹介された。
CodeZineでは、2009年5月に開催されたSODECにて実演された「インテル Parallel Studio」の概要を伝えたが、今回のイベントでは、ソフトウェア&サービス統括部・菅原清文氏による「スレッド化の手法とパフォーマンスの分析」と、米インテル社 ソフトウェア開発製品部門のチーフ・エバンジェリスト兼ディレクター・James Reinders 氏の「並列化ロードマップ: 今後の予定」の2つの講演に注目した(Reinders氏のレポートは3ページ目から)。
スレッド化の手法とパフォーマンス分析ツール
登壇した菅原氏は「新しいプロセッサーが登場するとアプリケーションのパフォーマンスは向上するという考えがあるなら、この講義は退屈と考える人もいれば、アプリケーションのチューニングによってより高度なパフォーマンスを見出すことができると考える人もいるでしょう。導入してすぐにすばらしいパフォーマンスが得られなくても最悪の事態というわけではありません」とプレゼンテーションを始めた。
パフォーマンス分析について菅原氏は、アプリケーション命令、データ構造とレイアウトからなるソフトウェア側と、メモリやプロセッサーといったハードウェア側の相互作用を測定することであるとした。パフォーマンスのチューニングは、分析から探した問題点を改善し、最適化することと定義した。そして、チューニングのレベルは上から、システム、アプリケーション、プロセッサの3レベルに分かれるとし、より上位のレベルでチューニングを行うことが効果が大きいという。たとえば、メモリを増やしたらパフォーマンスが向上するというのは簡単なシステムレベルのチューニングで、プロセッサレベルになるとチューニングも難しくなっていく。
パフォーマンス・チューニングの流れ
次に菅原氏はチューニングの流れについて解説した。「1. ベンチマーク作成」「2. データ収集」「3. データの分析と問題の特定」「4. コードシステムの問題の修正」「5. 問題が修正されたか?」「6. パフォーマンス要件は満たされたか?」といった段階があるとし、要件が満たされるまで繰り返し修正を行い最適化していく。この流れは、先に挙げたどのレベルでも同じであると説明した。
最初に重要となるのがベンチマークの作成だ。ベンチマークは、何度も検証できるよう再現可能で、処理時間を計測するなど表現可能であり、そしてなるべく簡単に実行・検証・評価できるようなものでなければならないなどの事項を説明した。また菅原氏は「最適化の流れで一度に多くのことをしてはいけません。何がどの程度効果があったか分からなくなるからです。問題点をひとつずつ解消していくべきです」と解説した。
スレッド化を支援する開発ツール群
続いて菅原氏は、「シングルスレッドであっても検証から反映、デバッグ、性能測定というステップは同じ」とし、スレッド化を支援する製品の紹介を行った。インテルには、アプリケーションやシステムも含めたアーキテクチャーの分析ツールとして「VTune パフォーマンス・アナライザー」、分析結果を反映しスレッド化を導入するためのコンパイラーや各種ライブラリー、並列化において困難になるデバッグの支援を行う「インテル スレッド・チェッカー」、そして最適化やチューニングを行うツールには先述の「VTuneパフォーマンス・アナライザー」のほか「インテル スレッド・プロファイラー」がある。
菅原氏は、「パフォーマンスがよいということはCPUを“ビジー”にしておくことです。そのためには効率的なメモリ利用やスレッド化、データ構造の最適化が必要です。メモリを読みに行ってる間、CPUはWaitの状態になるので、そういったものをなるべく少なくしていく必要があります」と語った。
さらに菅原氏はCPUを“ビジー”にするための手法としては、マルチメディア拡張命令セットであるSSE(Streaming SIMD Extensions)やMMXを使って1つの命令でなるべくたくさんのデータ処理を行うことや、CPUのキャッシュを効率よく利用させる、命令数を最小限にすることで「リタイア」コンポーネントを減少させるなどがあると付け加えたうえで、「CPUがどれくらい処理に時間をかけているかどうかは、ツールを使わないと計れない」とした。