インテル(R) C++ コンパイラーと gcc ではいくつかの大きな違いがあります。インテル C++ コンパイラーで gcc コードをコンパイルする際は、次のことに注意してください。
インテル(R) コンパイラーでは、コンパイラーのバイナリー、ライブラリー、man ページ、ライセンスファイルの場所は環境変数によって認識されます。これらの環境変数は、gcc が使用する環境変数とは異なる場合があります。また、これらの変数はインテル・コンパイラーをインストールした後、デフォルトで設定されないという違いもあります。次の環境変数は、インテル・コンパイラーを実行する前に設定する必要があります。
'source' コマンドを使用して iccvars.sh シェルスクリプト (コンパイラーに同梱) を実行し、これらの環境変数を設定します。iccvars.sh の使用についての詳細は、「コマンドラインからのコンパイラーの起動」を参照してください。
これらの環境変数を iccvars.sh で設定すると、gcc との競合が発生しません。同じシェルで両方のコンパイラーを使用することができます。
インテル C++ コンパイラーは、インテル(R) アーキテクチャーで実行される際、アプリケーションからより高いパフォーマンスを引き出すという目的が想定された最適化コンパイラーです。そのため、-O2 などの特定の最適化は、インテル・コンパイラーのデフォルトの起動の一部として実行されます。デフォルトでは、gcc は最適化をオフにします。これは、-O または -O0 でコンパイルしたときに相当します。次の表は、-O<n> オプションの比較です。
オプション | インテル | gcc |
---|---|---|
-O0 | 最適化をオフにします。 | デフォルト。最適化をオフにします。-O と同じです。 |
-O1 | 速度がある程度向上し、コードサイズは減少します。 | 速度がある程度向上し、コードサイズは減少します。 |
-O2 | デフォルト。コードサイズはある程度増加しますが、速度について最適化します。-O と同じです。組み込み関数、ループのアンロール、インライン展開が行われます。 | コードサイズが増加しない限り、速度について最適化します。例えば、アンロールやインライン展開は行われません。 |
-O3 | -O2 の最適化に加えて、プリフェッチ、スカラー置換、ループ変換、およびメモリーアクセス変換などのより強力な最適化を有効にします。 | コードサイズは大きくなりますが、速度について最適化します。-O2 の最適化のほか、ループのアンロール、インライン展開が行われます。インテル・コンパイラーの -O2 -ip と同様です。 |
両コンパイラーで特定のプロセッサーを対象とする同様のオプションは多くありますが、インテル・コンパイラーには最新のプロセッサーを対象としたプロセッサー固有の命令スケジューリングを利用するオプションが含まれています。gcc アプリケーションを -march オプションまたは -mtune オプションでコンパイルする場合、IA-32 アーキテクチャーまたはインテル(R) 64 アーキテクチャーで実行されるアプリケーション向けのインテルの -x オプションまたは -ax オプションの使用を検討してください。IA-64 アーキテクチャーで実行されるアプリケーションの場合は、-tpp オプションを使用してください。
インテル・コンパイラーでは、コンパイルの一環として設定ファイルと応答ファイルの管理が行われます。設定ファイルに格納されるオプションは、すべてのコンパイルに適用され、応答ファイルに格納されるオプションはコマンドラインに追加された場合に適用されます。各ビルドに適用される make ファイルにいくつかのオプションがある場合は、これらのオプションを設定ファイル (../bin/icc.cfg および ../bin/icpc.cfg) に移動すると簡単です。
マルチユーザーのネットワーク環境では、icc.cfg ファイルと icpc.cfg ファイルにリストされているオプションは、通常、コンパイラーを使用するすべてのユーザーを対象としています。個別に設定する必要がある場合は、ICCCFG 環境変数または ICPCCFG 環境変数を使用し、/my_code/my_config.cfg などのように .cfg ファイルの場所と名前を指定します。コンパイラーに異なる設定ファイルを指示する際は、常にシステムの設定ファイル (icc.cfg および icpc.cfg) は無視されます。
インテル C++ コンパイラーでは、インテルの算術ライブラリー、libimf を必要とする算術関数を呼び出す場合、デフォルトでこのライブラリーがリンクされます。sin などの関数の場合、コンパイラーですでに sin 関数の計算方法が認識されているため、このライブラリーへの呼び出しは不要です。インテルの算術ライブラリーには、標準の libm にはない多くの関数が含まれています。sind 関数を使用する簡単な例は次のとおりです。
#include <stdio.h> #include <mathimf.h> double sind(double); double x = 90.0; int main(void){ printf("The sine of %f degrees is %f\n", x, sind(x) ); return(0); } |
gcc では、インテルの算術ライブラリーの呼び出しは行えません。