インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド

その他の考慮事項

インテル® C++ コンパイラーと gcc* にはいくつかの大きな違いがあります。 インテル® C++ コンパイラーでソースコードをコンパイルする際は、次のことに注意してください。

環境設定

インテル® C++ コンパイラーは、コンパイラーのバイナリー、ライブラリー、man ページ、ライセンスファイルの場所を環境変数から読み取ります。 これらの環境変数は、gcc* が使用する環境変数とは異なる場合があります。また、これらの変数はインテル® C++ コンパイラーをインストールしても、デフォルトで設定されません。 インテル® C++ コンパイラーを実行する前に、次の環境変数を設定する必要があります。

'source' コマンドを使用して iccvars.sh シェルスクリプト (コンパイラーに同梱) を実行し、これらの環境変数を設定することができます。 iccvars.sh の使用についての詳細は、「コマンドラインからのコンパイラーの起動」を参照してください。

iccvars.sh を使用してこれらの環境変数を設定すると、gcc との競合が発生しません。 同じシェルで両方のコンパイラーを使用することができます。

最適化の使用

インテル® C++ コンパイラーは、インテル® アーキテクチャーで実行する際に、アプリケーションからより高いパフォーマンスを引き出すための最適化コンパイラーです。そのため、-O2 などの特定の最適化は、インテル® コンパイラーのデフォルトの起動の一部として実行されます。 デフォルトでは、gcc は最適化をオフにします。これは、-O または -O0 でのコンパイルに相当します。 次の表は、-O<n> オプションの比較です。

オプション

インテル

gcc

-O0

最適化をオフにします。

デフォルト。最適化をオフにします。-O と同じです。

-O1

速度がある程度向上し、コードサイズは減少します。

速度がある程度向上し、コードサイズは減少します。

-O2

デフォルト。コードサイズはある程度増加しますが、速度について最適化します。-O と同じです。 組込み関数、ループアンロール、インライン展開が行われます。

コードサイズが増加しない限り、速度について最適化します。例えば、アンロールやインライン展開は行われません。

-O3

/O2 の最適化に加えて、プリフェッチ、スカラー置換、ループ変換、およびメモリーアクセス変換などのより強力な最適化を有効にします。

コードサイズは大きくなりますが、速度について最適化します。-O2 の最適化のほか、ループアンロール、インライン展開が行われます。 インテル® コンパイラーの -O2 -ip と同様です。

インテル® プロセッサーを対象にする

両コンパイラーで特定のプロセッサーを対象とする同様のオプションは多くありますが、インテル® コンパイラーには最新のプロセッサーを対象としたプロセッサー固有の命令スケジューリングを利用するオプションが含まれています。gcc* アプリケーションを -march オプションまたは-mtune オプションでコンパイルする場合、IA-32 アーキテクチャーまたはインテル® 64 アーキテクチャーで実行されるアプリケーション向けのインテルの -x オプションまたは -ax オプションの使用を検討してください。

設定の変更

インテル® コンパイラーでは、コンパイルの一環として設定ファイルと応答ファイルの管理が行われます。設定ファイルに格納されるオプションは、すべてのコンパイルに適用され、応答ファイルに格納されるオプションはコマンドラインに追加された場合に適用されます。各ビルドに適用される make ファイルにいくつかのオプションがある場合は、これらのオプションを設定ファイル (../bin/icc.cfg および ../bin/icpc.cfg) に移動すると簡単です。

マルチユーザーのネットワーク環境では、icc.cfg ファイルと icpc.cfg ファイルにリストされているオプションは、通常、コンパイラーを使用するすべてのユーザーを対象としています。 個別に設定する必要がある場合は、ICCCFG 環境変数または ICPCCFG 環境変数を使用して、/my_code/my_config.cfg などのように自分の .cfg ファイルの場所と名前を指定できます。 コンパイラーに異なる設定ファイルを使用するように指示すると、常にシステムの設定ファイル (icc.cfg および icpc.cfg) は無視されます。

インテルのライブラリーの使用

インテル® C++ コンパイラーは、よく使用される多くの関数の最適化された実装を含む追加ライブラリーを提供します。これらの関数の一部は、CPU ディスパッチを使用して実装されています。これは、さまざまなプロセッサーで実行されたときに異なるコードが実行されることを意味します。

提供されるライブラリーには、インテルの算術ライブラリー (libimf)、SVML (libsvml)、libirc などがあります。これらのライブラリーへの参照が生成されると、コンパイラーはデフォルトでそのライブラリーをリンクします。sinmemset のような一部のライブラリー関数は、コンパイラーがコードをインライン展開するため、ライブラリーへの呼び出しが不要な場合もあります。

インテルの算術ライブラリー (libimf)

インテル® C++ コンパイラーでは、インテルの算術ライブラリー (libimf) を必要とする算術関数を呼び出す場合、デフォルトでこのライブラリーがリンクされます。sin などの関数の場合、コンパイラーですでに sin 関数の計算方法が認識されているため、このライブラリーへの呼び出しは不要です。インテルの算術ライブラリーには、標準の算術ライブラリーにはない関数も含まれています。

gcc* では、インテルの算術ライブラリーの呼び出しは行えません。

このライブラリーの多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより高度に最適化されます。

SVML (Short Vector Mathematical Library) (libsvml)

ベクトル化が行われるとき、コンパイラーは libm 算術ライブラリー関数への呼び出しを libsvml 関数に変換することがあります。これらの関数は、インテルの算術ライブラリーと同じ基本演算を実装しますが、ショートベクトルのオペランドで演算を行います。そのため、効率が向上します。場合によっては、libsvml 関数は、対応する libimf 関数より多少精度が低くなります。

このライブラリーの多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより高度に最適化されます。

libirc

libirc には、よく使用される文字列関数とメモリー関数の最適化された実装が含まれています。例えば、memcpymemset の最適化されたバージョンがあります。 memcpy および memset への呼び出しがあれば、コンパイラーは自動的にこれらの関数への呼び出しを生成します。 また、コンパイラーは memcpy あるいは memset に相当するループをこれらの関数へ変換することもあります。

このライブラリーの多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより高度に最適化されます。

最適化に関する注意事項

インテル® コンパイラーは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項の適用対象である特定の命令セットの詳細は、該当する製品のユーザー・リファレンス・ガイドを参照してください。

改訂 #20110804

関連情報


このヘルプトピックについてのフィードバックを送信