さまざまな PC 系記事サイトで今後登場する CPU (Cannonlake✝、Icelake✝、などなど) の新機能が取り上げられていますが、発表前のプロセッサーであるため噂の域を出ません…
しかし、サポートされる命令セットに関しては明らかに知ることができます。インテル® C++/Fortran コンパイラーは発表前のプロセッサーに対する最適化オプションを提供しています。
コンパイラーの help
オプションで確認できます。Windows* 版の C++ コンパイラーの場合、icl /help
でヘルプを出力できます。
図 1 ヘルプの命令セットオプション
インテル® コンパイラーには x
と ax
という最適化オプションがあり、生成する命令セットや対象のプロセッサーを指定します。例えば、/QxAVX2
であればインテル® AVX2 命令セットを使用するなど。
ここで図 1 のプロセッサー開発コード名に注目してください。CANNONALAKE✝、ICELAKE-CLEINT✝、ICELAKE-SERVER✝ などまだ発表前のプロセッサーがリストされています。では、実際にコードを生成してみましょう。ここでは、サンプルとして入手が容易な PI を求めるソースを使用します。
まず、インテル® AVX2 で命令を生成して実行できるか確認して見ましょう。ここで使用するプロセッサーは、インテル® Core™ i7-9700K プロセッサーです。
では、次に CANNONLAKE✝ 向けにコードを生成して実行してみます。
コンパイルはできましたが、インテル® Core™ i7-9700K プロセッサーはインテル® AVX-512 をサポートしないため実行できません。インテル® コンパイラーの x
(/Qx
) オプションを使用すると、ランタイムのプロセッサー・チェックルーチンが埋め込まれ、どの命令が使用できないかメッセージが表示されます。ここで CANNOLAKE✝ は、AVX512DQ、AVX512F、AVX512IFMA52、AVX512CD、AVX512BW、AVX512VL、AVX512VBMI 命令を実行できますが、実行環境のプロセッサーではサポートされていないことが分かります。
ここからCANNONLAKE✝ がインテル® AVX-512 命令をサポートし、その中には発表済みの CASCADELAKE✝ には含まれていない命令セットがあることが分かります。CASCADELAKE✝ を確認してみましょう。
CASCADELAKE✝ には、AVX512IFMA52 と AVX512VBMI が含まれていません。
では、本命 Sunny Cove✝ アーキテクチャーが採用されるという ICELAKE✝ で確認してみましょう。インテル® コンパイラーのバージョン 19.0 では、ICELAKE-CLIENT✝ と ICELAKE-SERVER✝ にオプションが分けられました (以前は ICELAKE✝ のみ)。これは、将来サポートされる命令セットが拡張されることを意味していると思われます。ICELAKE-CLENT✝ で命令を生成してみます。
おお。CANNONLAKE✝ に加えていくつかの命令セットが追加されています。つまりこれが ICELAKE✝ のクライアント・プロセッサーでサポートされる命令であることが分かります。
ICELAKE-CLIENT✝ では、サイトでは検索できないいくつかの命令が追加されています (RDPID、GFNI、VAES などなど)。命令の名称から機能が想像できるものもありますが、実際はどうなのでしょう?
そう、生成された命令を確認すればいいのです、コンパイラーにはアセンブリー命令を出力するオプション (/S
や /Fa
) が用意されています。アセンブリーを出力して見慣れない命令セットを探し出すことができます。しかし、これはそれほど容易ではありません、まずその命令セットが適用されるソースコードを準備する必要があります。残念ながら、サンプルの PI では、これらの命令セットは生成されません。
インテル® コンパイラーを使用するとこんな遊びができます。
みなさんもお試しあれ。
1 日も早くクライアント環境でインテル® AVX-512 が使える日が来ますように…
注意: プロセッサーの発表時にサポートされる命令セットは、メッセージで表示されるものと異なる可能性があります。
厳密には、『Intel® Architecture Instruction Set Extensions and Future Features Programming Reference』 (英語) というマニュアルで、今後リリース予定の命令セットが公開されています。また、プロセッサー・エミュレーターを使用して将来のプロセッサーでサポートされる命令セットをエミュレートして実行することができます。
詳しくは、https://software.intel.com/en-us/forums/intel-isa-extensions をご覧ください。