Intel C++ Compiler (ICC) の解説
Intel
C++ Compiler(ICC)は、
インテルが開発・販売しているCおよび
C++言語用の高性能
コンパイラです。日本国内では、XLsoftが販売とサポートを行っています。ICC、またはICL(
Linux/macOSおよびWindows用
コンパイラの実行プログラム名に由来)という略称で知られています。
概要
ICCは、
インテル製
CPUの性能を最大限に引き出すために開発されました。
インテル自身が開発した
コンパイラであるため、自社製
CPUに対する最適化性能は非常に高く、最新の命令セットへの対応も迅速です。主にx86/x64アーキテクチャをサポートしており、バージョン11.1までは
IA-64 (Itanium) もサポートしていましたが、バージョン12.0以降ではサポート対象外となりました。バージョン11.1では、次世代256ビット命令であるIntel AVXや、米国標準暗号方式であるAES命令セットがサポートされ、バージョン12.1ではAVX2命令がサポートされました。
最適化性能においては、特に
SIMD命令を使用した自動ベクタライズ機能が優れています。ただし、自動ベクタライズは
コンパイラが判断可能な限定的な状況でのみ適用されるため、アセンブラや組み込み関数を用いて手動で最適化されたコードの実行速度には及ばないことが多くあります。しかし、
SIMD命令を扱えるプログラマは限られているため、より多くのプログラマが
SIMD命令の恩恵を受けられるよう、自動ベクタライズ機能の強化が継続されています。
ICCは、プロファイル計測用バイナリを出力し、実際の運用データに基づいて最適化を行うプロファイリング機能や、
OpenMPによる自動マルチスレッド化にも対応しています。バージョン11からは、1つのパッケージで多言語に対応しました。
実行に必要な
ライブラリやリンカは付属していないため、他の
コンパイラの環境に依存する形で実行されます。Windowsでは
Microsoft Visual Studio、
LinuxではGCCが必要です。Visual Studio向けの
プラグインも存在し、
統合開発環境での利用も可能です。
コマンドラインツールとしての利用であれば、無料版のVisual
C++ Express Editionをホスト環境として利用できます。Visual Studio 2010 Expressまでは、
IA-32をターゲットとする場合は追加のSDKインストールは不要ですが、Intel 64をターゲットとする場合は別途x64開発用SDKをインストールする必要がありました(Visual Studio Express 2012 for Windows Desktop以降は不要)。
30日間の無料評価版が提供されており、使用期限以外の機能制限はありません。正規
ライセンスを購入すれば、そのまま製品版として使用できます。
ライセンスには1年間のアップデート入手権利が含まれており、
ライセンス停止後に最新版をダウンロードしても使用できませんが、停止前にリリースされたバージョンは継続して使用できます。
ライセンスを更新することで、アップデート入手権利を維持できます。
Linux版には、非商用目的に限り無償で使用できるバージョンが公開されています。
ICCはその高い性能から、特に画像処理、映像、音声・音響関係の分野で広く利用されています。
開発環境としてのWindows VistaおよびWindows Server 2003のサポートは、バージョン14.0で終了しました。
言語規格のサポート
C99とC11の対応リストが公開されており、バージョン18.0でC11にほぼ対応しています。
C++11、
C++14、
C++17の対応リストが公開されています。バージョン15.0で
C++11にほぼ対応し、バージョン19.0では
C++14を完全にサポートし、
C++17の大部分をサポートしています。
Visual
C++コンパイラでサポートされている
C++/CLI、
C++/CX、
C++ AMPの機能は使用できません。また、Windowsストアアプリの開発にも使用できません。
OpenMP規格は、バージョン12.1で
OpenMP 3.1をサポートし、バージョン14.0で
OpenMP 4.0の機能を一部サポート、バージョン19.0で
OpenMP 4.5および
OpenMP 5.0の一部をサポートしています。
並列化のためのC/
C++言語拡張としてCilk Plusをサポートしていましたが、バージョン18.0で非推奨となりました。
Intel
C++ Compiler 11.1 プロフェッショナル エディションには、以下の
インテル純正の高性能
ライブラリが付属します。
Intel Integrated Performance Primitives (IPP): 画像処理・信号処理・動画処理などに最適化されたマルチメディア用ライブラリ
Intel Threading Building Blocks (TBB): スレッドセーフ化されたコンテナや同期クラスを含む並列化用
C++テンプレート
ライブラリ
* Intel Math Kernel Library (MKL): BLAS、
LAPACK、FFTなどの高度な演算処理用に最適化された数学
ライブラリ
バージョン10までは、上記
ライブラリが付属しないスタンダード エディションが存在しましたが、バージョン11からはプロフェッショナル エディションのみの提供となりました。バージョン12以降の販売製品名は、Intel
C++ Compilerではなく、これらの
ライブラリを含むスイート製品としてIntel
C++ Composer XEという名称が使用されていましたが、Intel Parallel Studio(開発ツール類を含む総合スイート製品)のバージョン2015以降は、「Intel Parallel Studio XE Composer Edition for
C++」以上の製品エディションにIntel
C++ Compilerが含まれる形となりました。
これらの
ライブラリは単体製品としても販売されています。Intel
C++ Compilerを使用せず、Visual
C++コンパイラなどとIPP/TBB/MKLを組み合わせて使用することも可能です。
注意点・問題点
バージョン8から、実行開始時の
CPUチェックでAMDの
CPUを正しく認識しない問題が発生し、AMD製
CPUでの実行性能が低下する場合があります。この問題を回避するために、古いバージョン7を使用し続ける開発者もいます。
CPUチェック処理を独自に記述し、リンク時に強制的に上書きすることで回避することも可能です。
デフォルト設定では、高速化のために浮動小数点処理で自動的にSSEを使用するため、
FPUを使用した場合と処理結果に差異が生じる場合があります。精度重視の設定でコンパイルすることで
FPUを使用するコードを生成できますが、速度は低下します。
コンパイルオプションでマルチ
CPU対応バイナリを出力できますが、コードサイズが増大する傾向があります。
Intel
C++ Compilerによって出力されたバイナリの実行時に、Intel
C++ Compiler独自のDLLや共有
ライブラリが必要となる場合があります(
OpenMPやIPP
ライブラリを明示的に使用していなくても、特定の最適化オプションを有効にすることで、
OpenMPやIPPが暗黙的にリンクされる場合があります)。
インテルからはランタイム
ライブラリ(libiomp5md.dllなどを含むパッケージ)が無償配布されていますが、Microsoft Visual
C++のランタイムとは異なり、一般の
エンドユーザーには公開されておらず、開発者自身がアプリケーションに添付するなどして再配布する必要があります。この点に留意せずランタイムの再配布を行わない開発者が多いため、
エンドユーザーがプログラムを実行できないという問題が報告されています。
ライブラリを静的リンクすることで、コードサイズは増大しますが、ランタイムを必要としないコードを生成できます。ただし、IPPなどで
SIMD拡張命令を使用した高速な関数を使用するためには、プロセッサの対応状況を調べるための初期化関数(ippInit()関数)を別途呼び出す必要があります。また、スタティック
ライブラリ版のIntel
OpenMPはIPP 7.0までの提供となっているため、以降のバージョンでは
OpenMPランタイムの動的リンクが必須となります。