GCCとICC、どちらがいい?

GNUのGCCコンパイラは、Linuxのデフォルトのコンパイラである。一方、IntelのICCコンパイラは、Intelアーキテクチャで高速に動作する。さて、どちらのコンパイラがいいのか。一言で答えるのは難しい。個人の主義も絡んでくるし、技術的な問題もあるからだ。

Intelの開発ソフトウェアは、そのコンパイラも含め、オープンソースではない。このため、まだ使ったことがないという人が多い。使う気のない人もいるし、使いたくても使えない人もいる(使う気のない人というのはオープンソースでないことが主義に反するから使わない人たちのことで、使いたくても使えない人というのはライセンスを購入する余裕がない人たちのことだ。無料のトライアル・ライセンスもあるが、試用期間はわずか30日である)。

オープンソースではない部分があるからと言って、Linuxの世界から締め出されてもよいという道理はない。まずは、個人の主義を除外して考えよう。では、何を基準に優劣を判断すればよいのか。

ベンチマーク。まずは、ベンチマークのサイトを見つけることから始めよう(できれば公平な組織が運用しているところが望ましい。たとえば、ここなど)。次に、どんなベンチマーク・テストが実施されるのか調べよう。中には、複雑な数値演算を実施し、完了までに要した時間で優劣を判断するものが少なくない。このテスト自体はすばらしいものなのだが、平均的なワークステーションを使用している平均的なユーザにとって役立つとは限らない。平均的なユーザとは、Linuxカーネルをロードし、XFree86を起動し、デスクトップ環境(KDEやGnomeなど)を読み込み、メールをチェックし、Webブラウザ(GaleonやMozillaなど)を起動し、OpenOfficeなどのアプリケーションを使用しているユーザのことだ。

この種の定量的なベンチマークは、日々使用する一般的なソフトウェアのテストにはあまり役に立たない。Linuxカーネル、Xシステム、メールソフトなどをIntelのコンパイラでコンパイルし、その結果少しも速くならないのなら、私ならGNUのコンパイラを使い続ける。こうなると、あとは自分の主義に基づいて判断するだけだ。つまりは、全面的にオープンソースかどうかということ。しかも、GCCなら費用がまったくかからない。

実際の環境でのテスト

私のLinuxシステムの一部をIntelのコンパイラで再コンパイルしてみたところ、問題がいろいろと発生した。

一番大きな問題は、そのままではコンパイルできないソフトウェアが多いということだ。できる限りGCCとの互換性を保とうとしているようだが、まだその域に達していない。このほか、ソフトウェア自体はきちんとコンパイルされても、補助ツールがICCを認識しないという問題もある。たとえば、パッケージの多くはlibtoolを使用する(システム全体から参照可能な/usr/bin/libtoolにlibtoolをインストールするものと、パッケージのインストール・ディレクトリにlibtoolのプライベート・コピーを格納するものとがある)。問題は、libtoolがICCを認識しないため、共有ライブラリなど一部のファイルが作成されないことだ。この影響を受けるパッケージの1つにKDEスイートがある。共有ライブラリが作成されないため、KDEスイートはコンパイルできない。必要なファイルを1つ1つ手作業でコンパイルしていくのは大変な労力である。

一方、QTなどのように、きちんとコンパイルされるパッケージもある。ICCの使用をQTに指示すると、QTがその指示どおりに自身を設定するからだ。最終的に、QTは何事もなくコンパイルされる。GCCでコンパイルするのとまったく変わらない。

もっと大規模なプログラム(KDE、Mozilla、OpenOfficeなど)もコンパイルしてみた。しばらくいろいろ試してみたが、労力に見合うメリットは得られないと判断した。

単純なプログラムなら、簡単に試すことができた。コンパイル方式が単純なので、たいていは問題なくコンパイルできる(結局は、libtoolを使用しないということに尽きる)。ICCでコンパイルすると、わずかだが動作が速くなるアプリケーションもある。bzip2などがそうだ。146MBのlinux-2.4.20.tarファイルを圧縮してみたところ、約4秒速くなった。しかし、linux-2.4.20.tar.bz2ファイルの解凍速度は変わらなかった。Lame(MP3エンコーダ)も試してみた。80MBのWAVファイルからMP3形式へのエンコードは約5秒速く、そのMP3ファイルからWAV形式へのデコードは約1秒速いという結果が得られた。このほか、CPUをたくさん消費する操作についてもテストしてみたが、大きな違いは見られなかった。以上のテストは、2.2GHzのIntel Pentium 4で実施した。RAMは、512MBである。もっと古いハードウェアなら、顕著な違いが見られるかもしれない。

わずかだがこのような差が出るのは、テストしたソフトウェアがあまり最適化されていないことにも原因がある。単にICCでプログラムをコンパイルするというのは1つのステップに過ぎない。ソフトウェアの最適化に関心があるのであれば、VTune Performance Analyzerを使って、ソフトウェアのボトルネックを特定することをお勧めする。コンパイラの最適化は、ソースコードの品質に大きく左右されるからだ。

結論をまとめよう。日々普通のソフトウェアを使っているだけなら、Intelのコンパイラを使うメリットはないと思われる。わざわざICCのライセンスを購入するだけの価値があるかと問われれば、ノーと言わざるを得ない。ただし、複雑な計算を大量に実行するソフトウェア(MP3エンコーダやビデオ・レンダリング・ソフトウェアなど)であれば、動作効率が増す可能性は十分にある。実例については、こちらのケーススタディを参照してほしい。