アセンブラコードで見るC++ Composer XEの強力な最適化機能 5ページ

ループの構造を変更して最大限の最適化を行う「ハイパフォーマンス並列最適化」

 昨今のCPUでは、どのようにメモリアクセスを行うかによって大幅にパフォーマンスが変動する。CPUの動作速度は近年では2~3GHz程度が主流であるが、CPUと外部を接続するバスの速度はその2分の1から4分の1程度であり、さらにメモリの動作速度がそれよりも小さい場合もある。そのため、昨今のCPUでは大容量のキャッシュを搭載し、メモリアクセスを抑えるように設計されている。しかし、それでもキャッシュ容量は数MBというサイズであり、大容量のデータを扱うアプリケーションの場合、メモリへの頻繁なアクセスは避けられない。

 インテル C++ Composer XE 2011のハイパフォーマンス並列最適化機能(HPO)は、このようなキャッシュアクセスやメモリアクセスなども考慮し、また可能な限りSSEや並列化などを行えるよう、ループや命令の順序を変更して最適化する機能である。

 インテル C++ Composer XE 2011では、最適化レベルとして「Od」および「O1」、「O2」、「O3」が用意されており、「O3」を選択することでループ構造の変更も含めた最大限の最適化が行われるようになる(表6)。

表6 インテル C++ Composer XE 2011の最適化レベル
最適化レベル 説明
Od 最適化なし
O1 サイズを最小化
O2 速度を最大化
O3 速度を最大化+最大限の最適化

 たとえば次の図2および図3は、冒頭で紹介した画像処理プログラム中で、実際にぼかし処理を行っている個所のコードと、そのアセンブラコードをインテル VTune Amplifier XE 2011で表示させたものだ。左側にCコード、右側に対応するアセンブラコードが表示されているが、最適化レベルO2の場合と、O3との場合ではアセンブラコードが大幅に異なり、O2の場合はCコードと対応するアセンブラコードがほぼ同じ順番で並んでいるのに対し、O3の場合はコードの順番が多くの個所で入れ替わっていることが分かる。

図2 画像処理コードとそのアセンブラコード(最適化レベルO2)
図2 画像処理コードとそのアセンブラコード(最適化レベルO2)
図3 画像処理コードとそのアセンブラコード(最適化レベルO3)
図3 画像処理コードとそのアセンブラコード(最適化レベルO3)

 実際、このコード変更により、もっとも内側のループ内の処理の実行時間も変わっており、最適化が有効なことが分かる。

 なお、Visual Studio 2010でコンパイルしたコードに対して解析を行った場合は図4のようになった。アセンブラコードが異なるばかりか、時間がかかっている個所自体が異なるものになっていることが分かる。

図4 Visual Studio 2010でコンパイルしたバイナリコード
図4 Visual Studio 2010でコンパイルしたバイナリコード

並列プログラミングに役立つ機能も搭載、すべての開発者に有用なインテル C++ Composer XE 2011

 以上ではインテル C++ Composer XE 2011の最適化機能に焦点を当ててその機能を紹介してきたが、インテル C++ Composer XE 2011では自動的な最適化機能だけでなく、手動によるパフォーマンスチューニングや、プログラムの実装に有用な機能も搭載されている。たとえば「ガイド付き自動並列化」機能は、自動並列化では並列化できないループについて、診断メッセージを表示する機能だ。具体的にどこをどのように修正すれば自動並列化が行えるかが表示される。従来も並列化できないループについてはその旨が表示されたが、ガイド付き自動並列化ではその原因や個所なども表示され、より修正やチューニングが容易になった。

 また、Cilk PlusやOpenMP 3.0といった並列化技術もサポートされている。これはそれぞれ別記事(「インテル Parallel Composerの新機能――並列プログラムを容易に実装できる「インテル Cilk Plus」入門」および「ソフトウェア高速化の鍵は「並列化」:いま注目される並列化技術を知る」)で紹介しているためそちらを確認して頂きたいが、これらを用いることでより容易に並列プログラムを実装できるようになる。そのほか、インテル Inspector XEと連携し、プログラムのセキュリティ問題を解析する「スタティック・セキュリティー解析機能」や、プログラム中に実行時の挙動を計測する命令を埋め込み、実行時の挙動を収集してその結果を最適化に反映させる「プロファイルに基づく最適化機能」(PGO)といった機能も搭載されている。

 高いパフォーマンスを求められるプログラムが要求される開発者や、並列プログラミングを行っている開発者にとって、インテル C++ Composer XE 2011のこれらの機能は非常に有用だろう。フル機能を30日間無償で利用できる体験版も用意されているので、まずはその機能、性能を試して見てほしい。