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

新着トピックス

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

 インテル C++ Composer XEには、強力な最適化機能を備えるコンパイラが含まれている。インテルCPUが備えるSSEやAVXといった機能を効率的に利用するコードや、マルチコアによる並列処理を行うコードを自動的に生成できるのが特徴だ。本記事ではインテル C++ Composer XEが持つさまざまな最適化機能を紹介するとともに、コンパイラが出力するアセンブラコードをチェックしてその効果を探っていく。

無視できないコンパイラの最適化機能、アプリケーションによっては数十パーセントものパフォーマンス向上も

 近年のCPUの進化に伴い、コンパイラの最適化機能が注目されるようになってきた。パイプライン化やキャッシュの大容量化、分岐予測や投機的な実行といった機能の採用など、CPUの内部アーキテクチャは進化を続けている。そのため、コンパイラにはCPUのリソースを効率良く利用できるバイナリコードを生成することが求められるようになっている。

 現在、WindowsやLinuxで利用できるコンパイラは商用のものからフリーのものまでさまざまなものがあるが、その中でもインテルCPU向けに高パフォーマンスのコードを生成することで定評があるのがインテルの「インテル C++ Composer XE 2011」(旧製品名:「インテル C++ コンパイラー」)だ(製品ラインアップについては『高度な最適化機能や並列プログラミングサポートを提供する新開発ツール「インテル Parallel Studio XE 2011」』で紹介している)。Oracleのデータベース製品のビルドなどにも採用されるなど、パフォーマンスが求められるアプリケーションでの採用実績も多い。

 しかし、コンパイラによるパフォーマンスの違いについては、一般にはあまり気にされていないのが現状だろう。一般的なデスクトップアプリケーションの分野ではCPUによる処理時間よりも各種I/O処理時間やユーザーの入力待ち時間が多いため、コンパイラを変更することによるパフォーマンス向上はあまり感じられない。しかし、たとえば大規模な数値演算を行うような科学・技術計算やシミュレーション、大容量の動画や音声、画像のエンコード/デコードなどを行うマルチメディアアプリケーションなどの分野では、コンパイラを変えるだけで数パーセントから十数パーセントものパフォーマンス向上が見られることもある。

 たとえば次の図1は、行列計算や画像処理、ファイルの圧縮/展開(解凍)を行うプログラムを、Visual Studio 2010とインテル C++ Composer XE 2011でそれぞれコンパイルし、その実行時間をVisual Studio 2010を100%として比較したものだ。測定条件の詳細については表1、2にまとめているが、インテル C++ Composer XE 2011の利用により、以下の条件ではおおむね5~10%程度実行時間が短縮されるという結果となった。

表1 パフォーマンス測定に使用したプログラム
プログラム説明
bzip2(展開)bzip2(http://bzip.org/)により、Firefox 3.6.12のソースコード(firefox-3.6.12.source.tar.bz2)を展開する際の処理時間を測定
bzip2(圧縮)bzip2により、Firefox 3.6.12のソースコード(firefox-3.6.12.source.tar.bz2)を圧縮する際の処理時間を測定
画像処理1024×768サイズの画像に対し、15×15の平均化フィルタを適用する時間を測定
行列演算double型の500×500行列の10乗を計算する時間を測定
表2 パフォーマンス測定に使用した環境
項目条件
CPUCore 2 Duo E6550(2.33GHz)
メモリ2GB
インテル C++ Composer XE 2011のコンパイルオプション/O3 /Oi /Og /GA /Quse-intel-optimized-headers
Visual Studio 2010のコンパイルオプション/Ox /Oi /GL

※特に表記のない限り、以下のテストやパフォーマンス測定でもこの環境を使用している このようにパフォーマンスの高いプログラムを生み出せるインテル C++ Composer XEであるが、実際にどのように最適化を行っているのかは、そのスペックだけからはあまり知ることはできない。そこで本記事では、インテル C++ Composer XEが出力するアセンブラコードをチェックしながら、その最適化機能について紹介していく。