VT-x に128バイトサブページ単位の書込み保護が導入される予定

将来の Intel x86 CPU に追加される機能を先出しで解説する Intel Architecture Instruction Set Extensions Programming Reference が Oct. 2017 に改定され -030 になった。前回の紹介は id:nminoru:20161014:intelcpu。

https://software.intel.com/sites/default/files/managed/c5/15/architecture-instruction-set-extensions-programming-reference.pdf

今回は、大きく2つの機能が追加されている。1つめはEPTを使ったVMMにおいてゲストVMの物理メモリの4KBページよりも細かい128バイト単位のサブページで書き込み保護を掛けるようにする機能と、ガロア体アフィン変換をする機能の2種類だ。

EPT-Based Sub-Page Permissions

ゲストVMの4KBページを32個の128Bサブページに分割し、それぞれに書込み保護をかけることができる。これまでの書込み保護は存在し、それがOKがで後にSPPのチェックが行われ、書込み保護に違反するとVM Exitすることになる。

基本的には4KBページよりも小さな単位の書き込みを拾えるので、Copy-On-Write動作による差分更新の必要なデータを小さくすることができる。いろいろ応用が考えられる。

  • ライブ・マイグレーションは、VMの停止時間をできるだけ少なく・切り替え直後の性能の低下を小さくするためには、VMを走行させた状態で移動元のメモリページをある程度まとめて移動先に転送し、その後にVMを停止させマイグレーション開始後にVMが変更したページを再転送する戦略をとることになる。この時にSPPがあれば再転送するデータ量は最小化できる。
  • 複数ノード間で動作する(ソフトウェア)分散共有メモリを作る場合、細かい粒度で変更箇所が検知できることは有利になる。
  • 同様にゲストVMの物理メモリとstorage-class-memoryな不揮発メモリをマッピングする場合もSPPが使える。

ちなみにサブページ機構は IA-64(Itanium) にも存在する。IA-64 の仮想記憶は 4K/8K/16K/64K/256K/1M〜 と様々なページサイズをとることができるが、IA-32 互換モードは常に 4KB を必要とする。そこで IA-64 側のページテーブルエントリのメモリ属性を特別な値(001b)に設定した場合、部分的にページテーブルが1段分増えて、通常ページが 4KB で分割されたサブページになり個別の物理メモリ位置と属性を指定することが可能になる。これは今回の x86-64 の SPP よりも強力な機能だ。

HPE Virtualized NonStop を発表

タンデムコンピューター由来の絶対無停止を謳う NonStop サーバーは、専用 CPU の Tandem/16(T/16) → MIPS → Itanium と動作する CPU を変えてきたが、2014年(id:nminoru:20141202:odyssey)に x86-64 CPU へ移植された。それでも NonStop サーバーは専用機での動作だったのだが、ついに仮想 VM 上で動作するように変わったようだ。

NonStop サーバーは可能な場合は物理的な CPU を lock-step 動作させることでフォールトレランス性を高めてきたが、仮想 VM 上ではそうはいかない。そこで仮想 CPU の 2 個をプロセスペアで組み、操作の切れ目のチェックポイント位置で同期させるという DRDB の CPU 版みたいなことをやっている。

CPUID に AVX-512 デープラーニング用命令のフラグが追加

将来の Intel x86 CPU に追加される機能を先出しで解説する Intel Architecture Instruction Set Extensions Programming Reference が Sep. 2016 に改定され -025 になった。前回の紹介は id:nminoru:20150925:intelcpu。

https://software.intel.com/sites/default/files/managed/69/78/319433-025.pdf

今回、CPUID 命令の返す CPU feature のフラグに AVX-512 のデープラーニング用命令のものが追加された。追加されたのは以下の 2 種類。

今回の資料では、実際にどのような命令が追加されたかは公開されなかった。

追記

Sep. 2016 に -025 に改定されたが、同じ月に -026 になった。

https://software.intel.com/sites/default/files/managed/c5/15/architecture-instruction-set-extensions-programming-reference.pdf

今回は AVX512_4VNNIW と AVX512_4FAPS がどのような命令なのか記載されている。

AVX512_4FAPS

追加されたのは 4 命令。

  • V4FMADDPS/V4FNMADDPS - Packed Single-Precision Floating-Pointer Fused Multiply-Add (4-iterations)
  • V4FMADDSS/V4FNMADDSS - Scalar Signle-Precision Floating-Pointer Fused Multiply-Add (4-iterations)

上記の命令はソースとして指定した 512-bit ZMM レジスタを16組の32ビットの単精度浮動小数とみなしてメモリ上の単精度浮動小数点と乗算ができる。
ただし、それで終わりではなくソースとして指定から連番の ZMM レジスタと続くメモリアドレスがさらに乗算処理される。繰り返しは最大 4 行えるので、1つの命令で ZMM レジスタが 4 本とメモリ 256 バイトを同時処理することができる。

AVX512_VNNIW

追加されたのは 2 命令

  • VP4DPWSSD - Dot Product of Signed Words with Dword Accumulation (4-iterations)
  • VP4DPWSSD - Dot Product of Signed Words with Dword Accumulation and Saturation (4-iterations)

こちらも 1 命令で 512-bit ZMM レジスタを 4 本分使うことが出来る命令。符号付き 16 ビット整数同士の乗算結果を 32 ビット整数に加算してゆく。

PCOMMIT 命令は廃止に

Intel Architecture Instruction Set Extensions Programming Reference の Oct. 2014 -022 に華麗に登場した PCOMMIT 命令(d:id:nminoru:20150309:intelcpu)は廃止になった。

キャッシュフラッシュ命令(CLWB、CLFUSHOPT)は CPU キャッシュから追い出すが、メモリ書き込み要求はチップセット内にある WPQ(Write Pending Queue) に溜まるので、物理的なメモリにはすぐには書き込まれない。そのためストレージ・クラス・メモリ(SCM)な不揮発メモリに対してライトバックキャッシュを使うとキャッシュフラッシュを発行しただけでは、WPQ に書き込み内容が滞留して SCM への書き込みが保証できなかった。
PCOMMIT 命令は本当にメモリに反映されたことを保証する命令だったのだ。しかし Intel は SCM を使うシステムは電源遮断時に WPQ の内容のメモリへの書き出しを指示する Asynchronous DRAM Refresh(ADR)を搭載し、かつ UPS 的な一時的な給電を保証する機構を設けることを MUST することで PCOMMIT 命令を無くさせてしまったようだ。

Intel が ARM の SoC チップを製造

Intel が ARM チップを Intel ファブで製造する。具体的には LG Electronics、Netronome、Spreadrum のスマートフォン向け ARM SoC の製造を受託するようだ。

Intel は 2011 年に稼動した 22nm Fab からファウンダリビジネスを進めていて、Altera 向けの FPGA の製造を請け負ったりしていた(d:id:nminoru:20130303:intelfab)

Timestamp-Counter Scaling for Virtualization White Paper

将来の Intel x86 CPU に追加される機能を先出しで解説する Intel Architecture Instruction Set Extensions Programming Reference が Oct. 2015 に改定され -023 になったようだ。前回(id:nminoru:20150309:intelcpu)の -022 と比べると、MPX 機能が Software Developer's Manual へ移動され分量が減ったのと、微妙な修正が入った以外は変更がない。

https://software.intel.com/sites/default/files/managed/07/b7/319433-023.pdf

そのかわり「Timestamp-Counter Scaling for Virtualization White Paper」というドキュメントが公開されている。

http://www.intel.com/content/www/us/en/processors/timestamp-counter-scaling-virtualization-white-paper.html

CPU は温度の高低などによって周波数を上げたり下げたりするが、Intelx86 CPU の Timestamp-Counter(TSC) は暫く前から CPU の実周波数とは独立して常に一定の時間でサイクルを刻む Constant TSC になっている。さらに CPU が深いスリープ状態になった場合にも TSC は止めずに動く Invariant TSC だ。
さらに仮想マシン用の機能としてゲストが TSC を読む RDTSC 命令を読んだ場合、ホスト側の CPU のリアル TSC に対して仮想マシンごとに設定されたオフセット値を足した値を返す TSC offset 機能が実装されている。RDTSC 命令は頻出実行命令だが、TSC offsetting があれば性能を落とさずに、かつ仮想マシン毎に矛盾のない値を返すことができる。ただ異なるホスト間のマイグレーションを行う場合、サーバーに装着された CPU の世代や周波数が異なっているかもしれない。CPU 周波数が高い CPU と低い CPU では TSC の刻みが異なるため、TSC offsetting だけではこの差を吸収できない。
今回、提示された機能はゲストが RDTSC 命令を使った場合にリアル TSC に係数をかけた値を返す TSC multiplier という機能だ。TSC offsetting と TSC multiplier を組み合わせることで、仮想マシンに設定された仮想 CPU 周波数どおりの進み方をする TSC を、異なる性能サーバー間をマイグレーションする環境下でも手に入れることができるようだ。
ただ現在のところ詳細は記述されていない。

x86 の仮想ページに Protection Key が付いた

忙しくて見落としていたのだが 4 月に Intel64 and IA-32 Architectures Software Developer's Manuals が version 054 に改訂されていた。この版には仮想メモリの保護方式に Protection Key 機能が追加された。

x86 はこれまでもページ単位に特権モード(supervisor-mode access)ではアクセス可能だが非特権モード(user-mode access)ではアクセスを禁止するという機能があった。これは x86 のページテーブルエントリの U/S ビットで制御し、このビットが 1 なら user-mode access 可能だが、0 なら supervisor-mode access のみ可能にできるものだった。User-mode か supervisor-mode は CPU の特権レベル(CPL)で決まる。x86 は 0〜3 の 4 段階を用意し、値が低いほど特権レベルが強い。ただし U/S ビットに関しては CPL が 3 なら user-mode access、0〜2 なら supervisor-mode になる。つまり CPL が 4 段階あるのに、ページテーブルエントリには 1 ビットしか用意されていないので実質 2 段階しか効果がない。
x86 以外のアーキテクチャではページテーブルに複数ビット分の特権モードビットがあるものがある。例えば IA-64 の場合、CPU の特権モードは 4 段階だが、ページテーブルエントリに 2 ビットを用意しているので、ページにも 4 段階の区別を設けることができる。ただしこの場合でも、CPU がある特権レベルを持てば、それよりも低い特権レベルのページには全てアクセスが可能になり細かい制御はできない。

仮想メモリのページに対してこれとは別のアプローチをとるものがある。System/370 の Key-controlled protection、PA-RISC 2.0 の Access ID & Protection ID、IA-64 の Protection Key Register などの仕組みである。仮想ページの情報を記録するページテーブルエントリ*1に、レベルではなくキーを設定する。CPUにはアクセス可能なキーを指示するレジスタがあり、両者が一致すればアクセス可能となる。キー長はアーキテクチャによって異なるが、キー長の範囲でページを色分けすることが可能になる。ただし CPU は同時に複数の「色」のページにアクセス可能とするため、CPU 側は複数のキーを持つことが可能になっている場合が多い。

この機能を使うと、同一メモリ空間の異なる属性のメモリ領域に別々のキーを与えることができ、例えばあるスレッドからはアクセス可能だが別のスレッドからはアクセス禁止というメモリ領域を設けることが可能になる。

System/370 IA-64 PA-RISC x86
ページ側のキー長 4ビット(16種類) 24ビット 15ビット(32ビットモード) or 31ビット(64ビットモード) 4ビット(16種類)
CPU側のキー数 1本 最低8本、実装上16本、仕様上はもっと多い 8本 16本全てをコントロール可能
マッチ条件 CPU側とページ側のキーが一致すること。ページ側のキー値0ならCPU側のキーに寄らず合致 存在するCPU側のキーのいずれかに一致すること CPU側のキーのいずれかに一致すること キーに対応するCPUの制御ビットが有効なこと

今回、x86 にも Protection Keys という名前で同種の機能が追加された。キー長は 4 ビットなので 0 〜 15 の 16 種類を採ることができる。

  • x86 の場合、ページテーブルエントリの最上位バイトは XD (execute-disable) ビットだが、続く 4 ビットに protection key を入れる。
  • PKRU(Protection key rights register for user pages)レジスタがアクセス可能なキーを制御する。16 種類しかキーがないので、1つのキーごとに2ビットづつの制御情報を持って 32 ビットの制御レジスタになっている。新設された RDPKRU と WRPKRU 命令で読み込み・変更する。各キーにアクセスを禁止・書き込みを禁止を設定できる。
  • Protection key 違反で #PF 例外が発生した場合、スタック上に積まれるエラーコードの 5 ビット目が PK ビットとなる。Protection-key が原因で #PF 例外が発生した場合、PK ビットが 1 となり protection-key violation であることが判明する。

*1:System/370 の場合は物理ページ単位で storage key に記録される