HPC/並列プログラミングポータルでは、HPC(High Performance Computing)プログラミングや並列プログラミングに関する情報を集積・発信しています。 |
[記事一覧を見る]
インテル 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%程度実行時間が短縮されるという結果となった。
プログラム | 説明 |
---|---|
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乗を計算する時間を測定 |
項目 | 条件 |
---|---|
CPU | Core 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が出力するアセンブラコードをチェックしながら、その最適化機能について紹介していく。
[PageInfo]
LastUpdate: 2011-01-11 19:30:29, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members