インテル® Xeon Phi™ プロセッサーとインテル® AVX-512 ISA 向けのコンパイル
この記事は、インテル® デベロッパー・ゾーンに公開されている「Compiling for the Intel® Xeon Phi™ Processor and the Intel® Advanced Vector Extensions 512 ISA」の日本語参考訳です。
この記事の PDF 版はこちらからご利用になれます。
はじめに
この記事では、インテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) の概要を説明し、インテル® コンパイラーを使用してインテル® Xeon Phi™ プロセッサー x200 製品ファミリー向けにアプリケーションをビルドするいくつかの方法を示します。
インテル® AVX-512 命令セット
インテル® AVX-512 命令は、包括的な機能とインテル® AVX やインテル® AVX2 命令セットよりも優れたパフォーマンスを提供します (詳細は、こちらの資料 (英語) のセクション 1.2 を参照してください)。インテル® AVX-512 命令セット・アーキテクチャー (ISA) は、次のグループで構成されています。
- インテル® AVX-512 基本命令 (インテル® AVX-512F):
インテル® AVX-512 のベースであり、EVEX エンコーディング・スキームでエンコードされた、512 ビットのベクトルレジスター (64 ビット・モードでは最大 32 ベクトルレジスター) と opmask レジスターを利用した条件処理をサポートする、インテル® AVX とインテル® AVX2 の SIMD 命令の拡張を含みます。 - インテル® AVX-512 競合検出命令 (インテル® AVX-512CD):
効率良い競合検出により、さらに多くのループをベクトル化できます。 - インテル® AVX-512 指数および逆数命令 (インテル® AVX-512ER):
特定の超越数学関数の計算を高速化するビルディング・ブロックを提供します。 - インテル® AVX-512 プリフェッチ命令 (インテル® AVX-512PF):
ギャザー/スキャッター命令に関連したメモリー操作のレイテンシーの軽減に役立つ新しい命令です。 - インテル® AVX-512 バイト命令およびワード命令 (インテル® AVX-512BW):
8 ビットと 16 ビットの整数演算を行うインテル® AVX-512 命令です。 - インテル® AVX-512 ダブルワード命令およびクワッドワード命令 (インテル® AVX-512DQ):
整数演算と浮動小数点演算を拡張する新しい 32 ビットと 64 ビットのインテル® AVX-512 命令です。 - インテル® AVX-512 ベクトル長拡張命令 (インテル® AVX-512VL):
ほとんどのインテル® AVX-512 命令が ZMM (512 ビット) レジスターだけでなく、XMM (128 ビット) と YMM (256 ビット) レジスターでも処理を行えるように拡張します。
インテル® Xeon Phi™ プロセッサー x200 製品ファミリー (開発コード名 Knights Landing) では、インテル® AVX-512F、インテル® AVX-512CD、インテル® AVX-512ER、インテル® AVX-512PF が実装されており、インテル® Xeon® プロセッサーでは、インテル® AVX-512F、インテル® AVX-512CD、インテル® AVX-512BW、インテル® AVX-512DQ、インテル® AVX-512VL が実装されます。
インテル® Xeon Phi™ プロセッサー x200 製品ファミリー向けにコンパイルする
インテル® AVX-512F とインテル® AVX-512CD は、インテル® Xeon Phi プロセッサー x200 製品ファミリーとインテル® Xeon® プロセッサーに共通の命令グループです。インテル® AVX-512ER とインテル® AVX-512PF は、インテル® Xeon Phi™ プロセッサー x200 製品ファミリーにのみ実装されています。そして、インテル® AVX-512BW、インテル® AVX-512DQ、インテル® AVX-512VL は、インテル® Xeon® プロセッサーにのみ実装されています。
次のインテル® コンパイラー・オプションを使用して、インテル® AVX-512 向けのコードを生成する実行ファイルをビルドできます。
-x<code> コンパイラー・オプション
一般的な形式は、-x<code> (Linux*) または /Qx<code> (Windows®) です。ここで、<code> は引数を表します。このオプションは、ターゲットとするプロセッサー機能を指定します。インテル® AVX-512 命令をターゲットにするには、生成するグループに応じて次の 3 つの引数のいずれかを指定します。
-xCOMMON-AVX512: インテル® AVX-512F およびインテル® AVX-512CD 命令を生成します。
-xMIC-AVX512: インテル® AVX-512F、インテル® AVX-512CD、インテル® AVX-512ER、およびインテル® AVX-512FP 命令を生成します。
-xCORE-AVX512: インテル® AVX-512F、インテル® AVX-512CD、インテル® AVX-512BW、インテル® AVX-512DQ、およびインテル® AVX-512VL 命令を生成します。
例えば、インテル® Xeon Phi™ プロセッサー x200 製品ファミリー向けにインテル® AVX-512 命令を生成するには、-xMIC-AVX512 オプションを使用します。Linux* システムでは、次のように指定します。
$ icc -xMIC-AVX512 application.c
このコンパイラー・オプションは、インテル® Xeon Phi™ プロセッサー x200 製品ファミリー向けに大きなバイナリーをビルドする際に役立ちます。コプロセッサー上でビルドすると時間がかかるため、代わりにインテル® Xeon® プロセッサー・ベースのマシンでビルドすることができます。
-ax<code> コンパイラー・オプション
一般的な形式は、-ax<code> (Linux*) または /Qax<code> (Windows®) です。ここで、<code> は引数を表します。このオプションは、インテル® プロセッサー向けの複数の機能固有の自動ディスパッチ・コードパスとベースライン・コードパス (汎用 IA コードパス) を生成します。ベースライン・コードパスは、ハードウェア・プラットフォームで特定の ISA がサポートされていない場合に使用されます。通常、ベースライン・コードパスはインテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2) 命令セットで構成されます。生成するインテル® AVX-512 命令のグループに応じて次の 3 つの引数のいずれかを指定します。
-axCOMMON-AVX512: インテル® AVX-512F およびインテル® AVX-512CD 命令を生成します。ベースライン・コードパスも生成します。
-axMIC-AVX512: インテル® AVX-512F、インテル® AVX-512CD、インテル® AVX-512ER、およびインテル® AVX-512FP 命令を生成します。ベースライン・コードパスも生成します。
-axCORE-AVX512: インテル® AVX-512F、インテル® AVX-512CD、インテル® AVX-512BW、インテル® AVX-512DQ、およびインテル® AVX-512VL 命令を生成します。ベースライン・コードパスも生成します。
このコンパイラー・オプションは、複数のプラットフォームで実行可能なバイナリーをビルドする際に便利です。-x<code> と -ax<code> と組み合わせて、ベースライン・コードパスで生成される命令セットを変更することもできます。例えば、-axMIC-AVX512 –xCOMMON-AVX512 を指定するとインテル® AVX-512 専用コードとして、ベースラインに COMMON-AVX512 を使用した機能固有の MIC-AVX512 を自動ディスパッチ可能なバイナリーを作成できます。
-xHost コンパイラー・オプション
一般的な形式は、-xHost (Linux*) または /QxHost (Windows®) です。このオプションは、コンパイルを行うホスト・プロセッサー上で利用可能な最上位の命令セット向けのコードを生成します。
例えば、インテル® Xeon® プロセッサー v3 ファミリーベースの Linux* システムでは、次のコマンドを実行すると、インテル® AVX2 ISA 向けのコードが生成されます。
$ icc -xHost application.c
一方、同じコマンドをインテル® Xeon Phi™ プロセッサー x200 製品ファミリーベースのシステムで実行すると、そのアーキテクチャーでサポートされているインテル® AVX-512 ISA 向けのコードが生成されます (-xMIC-AVX512 を指定した場合と同じです)。
このコマンドをインテル® AVX-512 をサポートするインテル® Xeon® プロセッサーで実行すると、そのアーキテクチャーでサポートされているインテル® AVX-512 ISA 向けのコードが生成されます (-xCORE-AVX512 を指定した場合と同じです)。
上記のすべてのオプションは、インテル® Xeon Phi™ コプロセッサー x100 製品ファミリーでは利用できません。
インテル® Software Development Emulator を使用して実行ファイルをテストする
インテル® Software Development Emulator (インテル® SDE) を使用して、インテル® Xeon Phi™ プロセッサー x200 製品ファミリー向けの実行ファイルをテストすることができます。インテル® SDE は、ソフトウェア・エミュレーターです。将来の命令のエミュレートを目的としており、パフォーマンスは考慮していません。インテル® Xeon Phi™ プロセッサー x200 製品ファミリー向けにインテル® SDE を実行する方法については、こちらの記事 (英語) で詳しく紹介されています。
まとめ
この記事では、インテル® AVX-512 命令の異なるグループの概要を説明し、インテル® Xeon Phi™ プロセッサー x200 製品ファミリー向けにインテル® AVX-512 ISA の利点を活用する実行ファイルをビルドするための、インテル® コンパイラーのオプションを紹介しました。
参考文献
- インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス (英語)
- インテル® Fortran コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス (英語)
- インテル® コンパイラー最適化クイック・リファレンス・ガイド
- インテル® AVX-512 命令 (英語)
- 追加されたインテル® AVX-512 命令
- インテル® Software Development Emulator (英語)
- インテル® Xeon Phi™ プロセッサー (開発コード名 Knights Landing) にアプリケーションを対応させる (英語)
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。