インテル® C++ コンパイラー 16.0 ユーザー・リファレンス・ガイド
インテル® C++ コンパイラーと Microsoft* コンパイラーにはいくつかの大きな違いがあります。インテル® C++ コンパイラーでコードをコンパイルする際は、次のことに注意してください。
コンパイラーのインストールでは、インテル® C++ コンパイラー用に適切な環境を設定する compilervars.bat バッチファイルが提供されます。compilervars.bat の実行に関する詳細は、「compilervars ファイルを使用するコンポーネントの場所の指定」を参照してください。
インテル® C++ コンパイラーは、インテル® アーキテクチャーで実行する際に、アプリケーションからより高いパフォーマンスを引き出すための最適化コンパイラーです。そのため、O2 オプションなどの特定の最適化は、インテル® C++ コンパイラーのデフォルトの起動の一部として実行されます。デフォルトでは、Microsoft* コンパイラーは最適化をオフにします。これは Od または O0 でのコンパイルに相当します。次の表は、O[n] オプションの比較です。
オプション |
インテル® C++ コンパイラー |
Microsoft* コンパイラー |
---|---|---|
/Od |
すべての最適化をオフにします。O0 と同じです。 |
デフォルト。すべての最適化をオフにします。 |
/O1 |
速度がある程度向上し、コードサイズは減少します。 |
最小サイズでコードを最適化します。 |
/O2 |
デフォルト。コードサイズはある程度増加しますが、速度について最適化します。組込み関数、ループアンロール、インライン展開が行われます。 |
最大限の速度でコードを最適化します。 |
/O3 |
/O2 の最適化に加えて、プリフェッチ、スカラー置換、ループ変換、およびメモリーアクセス変換などのより強力な最適化を有効にします。 |
サポートされていません。 |
どちらのコンパイラーにも特定のプロセッサーを対象とする同様のオプションが多くありますが、インテル® C++ コンパイラーには、最新のインテル® アーキテクチャーを対象としたプロセッサー固有の命令を利用するオプションが含まれています。IA-32 アーキテクチャーまたはインテル® 64 アーキテクチャー上で実行されるアプリケーションの場合は、インテル® C++ コンパイラーの [Q]x、/arch、または [Q]ax オプションの使用を検討してください。詳細は、各コンパイラー・オプションの説明を参照してください。
インテル® C++ コンパイラーでは、コンパイルの一環として設定ファイルと応答ファイルの管理が行われます。設定ファイルに格納されるオプションは、すべてのコンパイルに適用され、応答ファイルに格納されるオプションはコマンドラインに追加された場合に適用されます。すべてのビルドに適用される makefile にいくつかのオプションがある場合は、これらのオプションを設定ファイル (..\bin\icl.cfg) に移動すると簡単です。
マルチユーザーのネットワーク環境では、icl.cfg ファイルにリストされているオプションは、通常、コンパイラーを使用するすべてのユーザーを対象としています。個別の設定が必要な場合は、ICLCFG 環境変数を使用して、\my_code\my_config.cfg などのように自分の .cfg ファイルの名前と場所を指定できます。コンパイラーに異なる設定ファイルを使用するように指示すると、常にシステムの設定ファイル (icc.cfg および icpc.cfg) は無視されます。
インテル® C++ コンパイラーは、よく使用される多くの関数の最適化された実装を含む追加ライブラリーを提供します。これらの関数の一部は、CPU ディスパッチを使用して実装されています。これは、さまざまなプロセッサーで実行されたときに異なるコードが実行されることを意味します。
提供されるライブラリーには、インテルの算術ライブラリー (libm)、SVML (Short Vector Mathematical Library) (svml_disp)、libirc などがあります。これらのライブラリーへの参照が生成されると、コンパイラーはデフォルトでそのライブラリーをリンクします。sin や memset のような一部のライブラリー関数は、コンパイラーがコードをインライン展開するため、ライブラリーへの呼び出しが不要な場合もあります。
インテルの算術ライブラリー (libm)
インテル® C++ コンパイラーでは、インテルの算術ライブラリー (libim) を必要とする算術関数を呼び出す場合、デフォルトでこのライブラリーがリンクされます。sin などの関数の場合、コンパイラーですでに sin 関数の計算方法が認識されているため、このライブラリーへの呼び出しは不要です。インテルの算術ライブラリーには、標準の算術ライブラリーにはない関数も含まれています。
Microsoft* コンパイラーでインテルの算術ライブラリーの呼び出しは行えません。
libm ライブラリーに含まれる多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより高度に最適化されます。
SVML (Short Vector Mathematical Library) (svml_disp)
ベクトル化が行われるとき、コンパイラーは libm 算術ライブラリー関数への呼び出しを svml_disp 関数に変換することがあります。これらの関数は、インテルの算術ライブラリーと同じ基本演算を実装しますが、ショートベクトルのオペランドで演算を行います。そのため、効率が向上します。場合によっては、svml_disp 関数は、対応する libm 関数より多少精度が低くなります。
svml ライブラリーの多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより高度に最適化されます。
libirc
libirc には、よく使用される文字列関数とメモリー関数の最適化された実装が含まれています。例えば、memcpy や memset の最適化されたバージョンがあります。memcpy および memset への呼び出しがあれば、コンパイラーは自動的にこれらの関数への呼び出しを生成します。また、コンパイラーは memcpy あるいは memset に相当するループをこれらの関数へ変換することもあります。
libirc ライブラリーの多くのルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより高度に最適化されます。
インテル® コンパイラーは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項の適用対象である特定の命令セットの詳細は、該当する製品のユーザー・リファレンス・ガイドを参照してください。 改訂 #20110804 |