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

新着トピックス

インテル コンパイラーでコンパイルを行う際の注意点

 インテル コンパイラーでオープンソースソフトウェアをコンパイルする場合、基本的にはコンパイル設定ファイル(Visual Studioのプロジェクトファイル、もしくはMakefile)を書き換え、コンパイラとしてicl.exe(Windows版インテル コンパイラー)もしくはicc(Linux/Mac OS X版インテル コンパイラ-)を使用するように設定してやればよい。

Windows環境の場合

 Windows向けのオープンソースソフトウェアの場合、コンパイルにVisual Studioを使用するものと、makeコマンドを使用するものがある。Visual Studioを使用する場合、インテル コンパイラーに含まれるVisual Studio用プラグインを導入し、追加されるツールバーで「インテル C++を使用」ボタンをクリックすれば、自動的にコンパイルにインテル コンパイラーを使用する設定になる(図1)。また、プロジェクトの設定に「インテル固有」項目が追加されてインテル C++ コンパイラーのコンパイルオプションが設定できるようになるので、最適化の設定などはこちらで行う(図2)。

 コンパイルにmakeコマンド(GNU makefile、もしくはVisual C++に付属するnmake)を利用するソフトウェアの場合はmakefileを手動で編集する必要があるため、若干の手間が必要だ。といっても、基本的にはMakefileなどの「cl」もしくは「cl.exe」を「icl.exe」に変更するだけのパターンが多い。そのほか、設定にconfigureスクリプトを利用するものについては後述のLinux環境でのコンパイル設定と同様のやり方で設定が行える。ただし、インテル コンパイラーのコンパイルオプションはWindows版とLinux/Mac OS X版とで異なるので、その点には注意が必要だ。Windows版インテル コンパイラーはVisual C++との互換性があるため、基本的にはVisual C++でのコンパイルと同様の方法でコンパイルできることが多い。

Linux環境の場合

 Linux環境の場合、ほとんどのソフトウェアはconfigureスクリプトを使用してコンパイル設定を行う。configureスクリプトには使用するコンパイラなどを指定する機能があるので、それを使用して「icc」をコンパイラとして利用するよう指定すればよい。多くのconfigureスクリプトでは、下記のように「CC=icc CXX=icpc CFLAGS="<Cソースコードのコンパイルオプション>" CXXFLAGS="<C++ソースコードのコンパイルオプション>"」を追加してconfigureスクリプトを実行すれば良いだろう。

$ ./configure CC=icc CXX=icpc CFLAGS="-O2 -ip"" CXXFLAGS="-O2 -ip"

 なお、それぞれの環境で利用できる最適化オプションについては、エクセルソフトの製品紹介ページで公開されている「11.0 コンパイラー最適化ガイド」という資料が参考になる。この資料には、インテル コンパイラーを使用した最適化の手順や、利用できる最適化オプションがまとめられている。このなかでも、特にパフォーマンスの向上に有効と見られるオプションを表4にまとめた。ただし、これらのオプションを闇雲に指定すると、逆にパフォーマンスが悪化する場合もあるようだ。コンパイラー最適化ガイドによると、これらのコンパイルオプションを使用する場合まずはO2オプションを使用してコンパイルを行い、続いてO3やip、ipo、parallelなどを指定してパフォーマンスを比較するのが好ましいとのことだ。

表4 パフォーマンス向上に有効と見られるコンパイルオプション
オプション説明
WindowsLinux/Mac OS X
/O1、/O2、/O3-O1、-O2、-O3最適化レベルを指定する。O1がコードサイズ最小化、O2が標準的な最適化となる。O3はより複雑な最適化が実行される
/Qparallel-parallel自動並列化を実行する
/Qpar-threshold-par-threshold自動並列化を行うかどうか判断するしきい値を指定する。0を指定すると常に並列化が行われ、100を指定すると確実に有効な場合のみ並列化が行われる
/QxSSE3-xSSE3Core 2シリーズなどに搭載されているSSE 3命令を使用する。このオプションを指定して作成したバイナリは、SSE 3命令を備えたCPUでのみ実行可能となる
/Qip-ip単一オブジェクト内にある関数間での最適化を実行する
/Qipo-ipo複数のファイルに対して、オブジェクトのリンク時に関数/オブジェクト間での最適化を実行する

Linux版の場合

 Linux版の場合、公式に動作確認が行われているディストリビューションは次の7つである。

  • Asianux 3.0
  • Debian GNU/Linux 4.0
  • Fedora 9
  • Red Hat Enterprise Linux 3~5
  • SUSE LINUX Enterprise Server 9、10
  • TurboLinux 11
  • Ubuntu 8.04

 これ以外の環境ではインストール時に警告が表示されるので注意してほしい。なお、今回は検証用の環境としてDebian GNU/Linux 5.0を使用したが、特に問題は発生していないようだ。

 また、動作にはlibstdc++.so.5が必要である。たとえばDebian GNU/Linuxでは、次のようにしてlibstdc++.so.5をインストールできる。

# apt-get install libstdc++5

 なお、インテル C++ コンパイラーはデフォルトでは/opt/intel/Compiler/11.0/<リビジョン番号>/以下にインストールされる。そのため、コンパイルを行う前にはコンパイラ本体やライブラリがあるディレクトリにパスを通しておく必要がある。インストールディレクトリ内の「bin/」ディレクトリ以下にある「iccvars.sh」という環境設定用シェルスクリプトを読み込むことで必要な環境変数の設定が行われるので、コンパイルやconfigureスクリプトの実行前にこのシェルスクリプトを読み込んでおこう。ホームディレクトリにこのスクリプトのシンボリックリンクを作っておくと便利だ。

$ ln -s /opt/intel/Compiler/11.0/074/bin/iccvars.sh ~/
$ . ~/iccvars ia32