インテル® SSE およびインテル® AVX 世代 (SSE2、SSE3、SSSE3、ATOM_SSSE3、SSE4.1、SSE4.2、ATOM_SSE4.2、AVX、AVX2、AVX-512) 向けのインテル® コンパイラー・オプションとプロセッサー固有の最適化

同カテゴリーの次の記事

OpenMP* TR6 (テクニカル・レポート 6) に含まれる新機能

この記事は、インテル® デベロッパー・ゾーンに公開されている「Intel® Compiler Options for Intel® SSE and Intel® AVX generation (SSE2, SSE3, SSSE3, ATOM_SSSE3, SSE4.1, SSE4.2, ATOM_SSE4.2, AVX, AVX2, AVX-512) and processor-specific optimizations」(https://software.intel.com/en-us/articles/performance-tools-for-software-developers-intel-compiler-options-for-sse-generation-and-processor-specific-optimizations) の日本語参考訳です。


インテル® コンパイラーの IA-32 およびインテル® 64 プロセッサー向けオプションは?
プロセッサー固有の最適化オプションには、次の 3 種類があります。

  1. /arch:<code> (Windows*) または -m<code> (Linux* および macOS*) プロセッサー固有オプションは、<code> で指定されたプロセッサー向けのコードを生成します。これらのプロセッサー固有のオプションにより生成された実行ファイルは、その命令セットをサポートしているインテル® プロセッサー、または互換プロセッサーで実行できます。プロセッサー固有の最適化が行われ、インテル® ストリーミング SIMD 拡張命令 (インテル® SSE) やインテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) 命令セットを使用するため、対応する命令セットをサポートしていない古いプロセッサーでは、不正な命令などの例外が発生します。

    <code> には、次のいずれかの値を指定できます (<code> は、Linux* および macOS* では小文字でなければならず、Windows* では大文字と小文字が区別されません)。

    core-avx2   インテル® AVX2、AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。/arch:core-avx2 は Windows* でサポートされますが、-mcore-avx2 は Linux* および macOS* でサポートされません (代わりに -march=core-avx2 を使用してください)。
    avx インテル® AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。
    sse4.2 インテル® SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。
    sse4.1 インテル® SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。
    ssse3 インテル® SSSE3、SSE3、SSE2、SSE 命令を生成します。
    sse3 インテル® SSE3、SSE2、SSE 命令を生成します。
    sse2 インテル® SSE2、SSE 命令を生成します。/arch:SSE2 は Windows* のデフォルトで、-msse2 は Linux* のデフォルトです。
    ia32 汎用 IA-32 互換コードを生成します。/arch: または -m オプションとともに使用できます。(IA-32 コンパイラーのみ)。
  2. /Qx<code> (Windows*) または -x<code> (Linux* および macOS*) プロセッサー固有オプションは、<code> で指定されたプロセッサー向けのコードを生成します。これらのプロセッサー固有のオプションにより生成された実行ファイルは、プロセッサー固有の最適化が行われ、特定バージョンのインテル® SSE やインテル® AVX 命令セットを使用するため、その命令セットをサポートしているインテル® プロセッサーでのみ実行できます。このオプションは、/arch:x<code> または -m<code> オプションで有効にならない一部の最適化を有効にします。互換性のないプロセッサーで実行した場合にアプリケーションを停止するランタイムチェックが実行ファイルに挿入されます。このチェックにより、対象外のプロセッサーを迅速に検出し、潜在的な不正命令エラーを回避します。このチェックが有効になるように、メインプログラムまたはダイナミック・ライブラリーのメイン関数を含むソースファイルは、このオプションを指定してコンパイルしてください。

    <code> には次の値を指定できます (大文字と小文字は区別されません)。

    KNM MIC-AVX512 で有効になる QFMA (Quad Fused Multiply Add) 命令と QVNNI (Quad Virtual Neural Network Instruction) 命令を生成します。インテル® Xeon Phi™ プロセッサー (開発コード名 Knights Mill) 向けに最適化します。コンパイラー 18 以降のバージョンで利用可能です (Windows* および Linux* のみ)。
    COMMON-AVX512 インテル® プロセッサー向けのインテル® AVX-512 の基本命令、競合検出命令、および AVX2、AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。インテル® AVX-512 命令セット対応のインテル® プロセッサー向けに最適化します。コンパイラー 15 Update 2 以降のバージョンで利用可能です。
    MIC-AVX512 インテル® プロセッサー向けのインテル® AVX-512 の基本命令、競合検出命令、プリフェッチ命令、指数および逆数命令、および AVX2、AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。インテル® Xeon Phi™ プロセッサー x200 製品ファミリー向けに最適化します。Windows* および Linux* でのみ利用できます。
    CORE-AVX512 インテル® プロセッサー向けのインテル® AVX-512 の基本命令、競合検出命令、ダブルワードおよびクワッドワード命令、バイトおよびワード命令、ベクトル長の拡張、および AVX2、AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。インテル® Xeon® スケーラブル・プロセッサー向けに最適化します。コンパイラー 15 Update 1 以降のバージョンで利用可能です。
    CORE-AVX2 インテル® プロセッサー向けに、インテル® AVX2、AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。第 4、5、6 世代インテル® Core™ プロセッサーおよびインテル® Xeon® プロセッサー E3 v3/E5 v3/E7 v3/E3 v4/E5 v4/E7 v4 ファミリー向けに最適化します。コンパイラー 13 以降のバージョンで利用可能です。
    CORE-AVX-I インテル® プロセッサー向けに、第 3 世代インテル® Core™ プロセッサー向けの命令を含む、インテル® AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。第 3 世代インテル® Core™ プロセッサーおよびインテル® Xeon® プロセッサー E3 v2/E5 v2/E7 v2 ファミリー向けに最適化します。
    AVX インテル® プロセッサー向けに、インテル® AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。第 2 世代インテル® Core™ i7/i5/i3 プロセッサー・ファミリーおよびインテル® Xeon® プロセッサー E5/E3 ファミリー向けに最適化します。
    SSE4.2 インテル® プロセッサー向けに、インテル® SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。旧世代インテル® Core™ i7/i5/i3 プロセッサー・ファミリー、インテル® Xeon® プロセッサー 55XX/56XX/75XX 番台およびインテル® Xeon® プロセッサー E7 ファミリー向けに最適化します。
    ATOM_SSE4.2 インテル® プロセッサー向けに、インテル® SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。/Qinstruction:movbe (-minstruction=movbe) オプションが設定されている場合は MOVBE 命令も生成します。インテル® SSE4.2 および MOVBE 命令をサポートしているインテル® Atom™ プロセッサー向けに最適化します。
    SSE4.1 インテル® プロセッサー向けに、インテル® SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。45nm Hi-k インテル® Core™ プロセッサー向けに最適化します。
    SSSE3 インテル® プロセッサー向けに、インテル® SSSE3、SSE3、SSE2、SSE 命令を生成します。インテル® Core™ マイクロアーキテクチャー向けに最適化します。-xssse3 は、macOS* のインテル® 64 コンパイラーのデフォルトです。
    ATOM_SSSE3 インテル® プロセッサー向けに、インテル® SSSE3、SSE3、SSE2、SSE 命令を生成します。/Qinstruction:movbe (-minstruction=movbe) オプションが設定されている場合は MOVBE 命令も生成します。インテル® SSSE3 および MOVBE 命令をサポートしているインテル® Atom™ プロセッサー向けに最適化します。
    SSE3 インテル® SSE3、SSE2、SSE 命令を生成します。拡張インテル® Pentium® M マイクロアーキテクチャーおよび Intel Netburst® マイクロアーキテクチャー向けに最適化します。-xsse3 は、macOS* の IA-32 コンパイラーのデフォルトです。
    SSE2 インテル® SSE2、SSE 命令を生成します。Intel Netburst® マイクロアーキテクチャー向けに最適化します。
    HOST コンパイルを行うホスト・プロセッサー上で利用可能な任意の命令セットの命令を生成します。互換性のあるインテル以外のプロセッサーでの動作を含む詳細は、『インテル® C++ コンパイラー・デベロッパー・ガイドおよびリファレンス』を参照してください。
  3. /Qax<code> (Windows*) または -ax<code> (Linux* および macOS*) プロセッサー・ディスパッチ・オプションは、インテル® プロセッサー向けに複数のコードを生成します。プロセッサー・ディスパッチ・テクノロジーは、実行時にチェックを行ってアプリケーションを実行しているプロセッサーを検出し、そのプロセッサーに最適なコードを使用します。互換性のあるインテル以外のプロセッサーでは、デフォルトの最適化コードが使用されます。上記の 1 と 2 で説明したオプションを使用してデフォルトの最適化コードを変更できます。

    2 つの機能の値を組み合わせて使用できます。例えば、-axSSE4.1,SSSE3 (Linux* および macOS*) または /QaxSSE4.1,SSSE3 (Windows*) のように指定することができます。この例では、インテル® SSE4.1 をサポートするインテル® プロセッサーではインテル® SSE4.1 向けに最適化されたシーケンスが使用され、インテル® SSSE3 をサポートしインテル® SSE4.1 はサポートしないインテル® プロセッサーではインテル® SSSE3 向けに最適化されたシーケンスが使用され、その他すべてのプロセッサーではデフォルトのパスが使用されます。

    <code> には次の値を指定できます。

    KNM MIC-AVX512 で有効になる QFMA (Quad Fused Multiply Add) 命令と QVNNI (Quad Virtual Neural Network Instruction) 命令を生成します。コンパイラー 18 以降のバージョンで利用可能です (Windows* および Linux* のみ)。
    COMMON-AVX512 インテル® プロセッサー向けのインテル® AVX-512 の基本命令、競合検出命令、および AVX2、AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。インテル® AVX-512 命令セット対応のインテル® プロセッサー向けに最適化します。コンパイラー 15 Update 2 以降のバージョンで利用可能です。
    MIC-AVX512 インテル® プロセッサー向けのインテル® AVX-512 の基本命令、競合検出命令、プリフェッチ命令、指数および逆数命令、および AVX2、AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。インテル® Xeon Phi™ プロセッサー x200 製品ファミリー向けに最適化します。Windows* および Linux* でのみ利用できます。
    CORE-AVX512 インテル® プロセッサー向けのインテル® AVX-512 の基本命令、競合検出命令、ダブルワードおよびクワッドワード命令、バイトおよびワード命令、ベクトル長の拡張、および AVX2、AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。インテル® Xeon® スケーラブル・プロセッサー向けに最適化します。コンパイラー 15 Update 1 以降のバージョンで利用可能です。
    CORE-AVX2 インテル® プロセッサー向けに、インテル® AVX2、インテル® AVX、インテル® SSE4.2、SSE4.1、SSSE3、SSE3、SSE2 および SSE 命令を生成します。コンパイラー 13 以降のバージョンで利用可能です。
    CORE-AVX-I インテル® プロセッサー向けに、第 3 世代インテル® Core™ プロセッサー向けの命令を含む、インテル® AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。
    AVX インテル® プロセッサー向けに、インテル® AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。
    SSE4.2 インテル® プロセッサー向けに、インテル® SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。
    SSE4.1 インテル® プロセッサー向けに、インテル® SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。
    SSSE3 インテル® プロセッサー向けに、インテル® SSSE3、SSE3、SSE2、SSE 命令を生成します。
    SSE3 インテル® プロセッサー向けのインテル® SSE3、インテル® SSE2、インテル® SSE 命令を生成します。
    SSE2 インテル® プロセッサー向けのインテル® SSE2、SSE 命令を生成します。

プロセッサー固有のオプションは?

KNM インテル® Xeon Phi™ プロセッサー (開発コード名 Knights Mill)
MIC-AVX512 インテル® Xeon Phi™ プロセッサー x200 製品ファミリー
CORE-AVX512 インテル® Xeon® スケーラブル・プロセッサー
COMMON-AVX512 インテル® AVX-512F およびインテル® AVX-512CD 命令セット対応のインテル® プロセッサー
CORE-AVX2

第 4 世代インテル® Core™ プロセッサー
第 5 世代インテル® Core™ プロセッサー
第 6 世代インテル® Core™ プロセッサー
第 7 世代インテル® Core™ プロセッサー
第 8 世代インテル® Core™ プロセッサー
インテル® Xeon® プロセッサー E7 v3 ファミリー
インテル® Xeon® プロセッサー E5 v3 ファミリー
インテル® Xeon® プロセッサー E3 v3 ファミリー
インテル® Xeon® プロセッサー E7 v4 ファミリー
インテル® Xeon® プロセッサー E5 v4 ファミリー
インテル® Xeon® プロセッサー E3 v4 ファミリー

CORE-AVX-I 第 3 世代インテル® Core™ i7 プロセッサー
第 7 世代インテル® Core™ i5 プロセッサー
第 7 世代インテル® Core™ i3 プロセッサー
インテル® Xeon® プロセッサー E7 v2 ファミリー
インテル® Xeon® プロセッサー E5 v2 ファミリー
インテル® Xeon® プロセッサー E3 v2 ファミリー
AVX 第 2 世代インテル® Core™ i7 プロセッサー
第 2 世代インテル® Core™ i5 プロセッサー
第 2 世代インテル® Core™ i3 プロセッサー
インテル® Xeon® プロセッサー E5 ファミリー
インテル® Xeon® プロセッサー E3 ファミリー
SSE4.2 第 1 世代インテル® Core™ i7 プロセッサー
第 1 世代インテル® Core™ i5 プロセッサー
第 1 世代インテル® Core™ i3 プロセッサー
インテル® Xeon® プロセッサー 55XX 番台
インテル® Xeon® プロセッサー 56XX 番台
インテル® Xeon® プロセッサー 75XX 番台
インテル® Xeon® プロセッサー E7 ファミリー
ATOM_SSE4.2 インテル® Atom™ プロセッサー (インテル® SSE4.2 命令対応)
SSE4.1 インテル® Xeon® プロセッサー 74XX 番台
クアッドコア インテル® Xeon® プロセッサー 54XX/33XX 番台
デュアルコア インテル® Xeon® プロセッサー 52XX/31XX 番台
インテル® Core™2 Extreme プロセッサー 9XXX 番台
インテル® Core™2 Quad プロセッサー 9XXX 番台
インテル® Core™2 Duo プロセッサー 8XXX 番台
インテル® Core™2 Duo プロセッサー E7200
SSSE3 クアッドコア インテル® Xeon® プロセッサー 73XX/53XX/32XX 番台
デュアルコア インテル® Xeon® プロセッサー 72XX/53XX/51XX/30XX 番台
インテル® Core™2 Extreme プロセッサー 7XXX/6XXX 番台
インテル® Core™2 Quad プロセッサー 6XXX 番台
インテル® Core™2 Duo プロセッサー 7XXX (E7200 を除く)/6XXX/5XXX/4XXX 番台
インテル® Core™2 Solo プロセッサー 2XXX 番台
デュアルコア インテル® Pentium® プロセッサー E2XXX/T23XX 番台
ATOM_SSSE3 インテル® Atom™ プロセッサー
SSE3 デュアルコア インテル® Xeon® プロセッサー 70XX/71XX/50XX 番台
デュアルコア インテル® Xeon® プロセッサー (ULV および LV) 1.66/2.0/2.16
デュアルコア インテル® Xeon® プロセッサー 2.8
インテル® SSE3 命令セット対応インテル® Xeon® プロセッサー
インテル® Core™ Duo プロセッサー
インテル® Core™ Solo プロセッサー
デュアルコア インテル® Pentium® プロセッサー T21XX/T20XX 番台
インテル® Pentium® プロセッサー エクストリーム・エディション
インテル® Pentium® D プロセッサー
インテル® SSE3 命令セット対応インテル® Pentium® プロセッサー
SSE2 インテル® Xeon® プロセッサー
インテル® Pentium® 4 プロセッサー
インテル® Pentium® M プロセッサー
IA32 インテル® Pentium® III プロセッサー
インテル® Pentium® II プロセッサー
インテル® Pentium® プロセッサー

デフォルトのプロセッサーは?

  • Windows* または Linux* の IA32 アーキテクチャーおよびインテル® 64 アーキテクチャー向けにコンパイルする場合は、/arch:SSE2 (Windows*) または -msse2 (Linux*) がデフォルトです。生成されるコードは、インテル® SSE2 をサポートしているインテル® Pentium 4 プロセッサー、インテル® Xeon® プロセッサー、あるいは互換性のあるインテル以外のプロセッサーで実行できます。
  • macOS* の IA-32 アーキテクチャー向けにコンパイルする場合は、-xSSE3 がデフォルトです。コンパイラーは、インテル® SSE3、SSE2、SSE 命令を生成し、コードはインテル® Pentium® M プロセッサー向けに最適化されます。
  • macOS* のインテル® 64 アーキテクチャー向けにコンパイルする場合は、-xSSSE3 がデフォルトです。コンパイラーは、インテル® SSSE3、SSE3、SSE2、SSE 命令を生成し、コードはインテル® Core™ マイクロアーキテクチャー向けに最適化されます。

インテル® Pentium® III プロセッサー・ベースのシステムのように、インテル® SSE2 命令をサポートしていない古い IA-32 システム向けには、/arch:ia32 (Windows*) または -mia32 (Linux*) オプションを使用します。

その他の古いプロセッサー向けオプションおよび上記の推奨オプションとの関連については、http://software.intel.com/en-us/articles/ia-32-and-intel-64-processor-targeting-overview を参照してください。

その他の一般的な質問 (https://software.intel.com/en-us/articles/performance-tools-for-software-developers-sse-generation-and-processor-specific-optimizations-continue)

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事