x86 に AVX-512、SHA Extensions、Memory Protection Extensions(MPX)、Processor Trace(PT) が追加

将来の Intel x86 CPU に追加される機能を先出しで解説する Intel Architecture Instruction Set Extensions Programming Reference が Oct. 2013 に改定され -016 になったようだ。前回は -014 の日記を書いている(id:nminoru:20121003:intelcpu)。しばらくチェックを怠ったら一つ飛んだ。

http://software.intel.com/sites/default/files/319433-016.pdf

一つ前の -015 で AVX-512、SHA Extensions、Memory Protection Extensions(MPX)、Processor Trace(PT) という機能が追加された。-016 はドキュメントの修正が主で新機能の追加はないようだ。

AVX-512

AVX、AVX2 に続いて 512-bit SIMD の AVX-512 が追加される。32 本の 512-bit SIMD レジスタ(ZMM0〜ZMM31) と 8 本の opmask レジスタ(k0〜k7)が追加されるようだ。
新しい命令プレフィックス(EVEX)は62Hから始まる4バイトだそうだ。x86 命令デコーダーを書いている人はご愁傷様です。

SHA Extensions

SHA Extensions は Secure Hash Algorithm(SHA) のうち SHA-1 と SHA-256 の処理を高速化する命令群。7 命令が追加される。SSE 4.2 と同時期に AESNI extensions と呼ばれる Advanced Encrpytion Standard(AES) を扱う 6 つの命令が追加されたが、その続きのようだ。
SHA Extensions を導入すると、この手のハッシュアルゴリズムのうちメジャーなものは全てサポートしたことになるので、この系統の命令追加は一段落する?

Memory Protection Extensions(MPX)

Memory Protection Extensions(MPX) はユーザープログラムと OS に対してアクセス許可区間を設定し、違反すると例外(#BR exception)を発生させる機構だ。区間を指定するために bounds registers が追加されている。supervisor-mode と user-mode で別々に有効になる。この保護機能を使うとバッファオーバーランを禁止したり、マルチプロセスであってもスレッド毎にアクセス可能な領域を絞ることができる。

Bounds registers は 4 本(BND0 〜 BND3) があり、64 ビットアドレス空間中に Upper Bound(UB) と Lower Bound(LB) を設定できる。Bounds registers へ区間の設定は BNDMK 命令で行うのが基本だ。BNDMK 命令を実行する前に Upper bound と lower bound を組にした 128-bits (16バイト)をメモリに置いておく。BNDMK 命令は区間情報の置かれたメモリアドレスと 0〜3 の bounds register の番号を指定してロードする。区間情報をレジスタで渡さずにメモリ上に配置したのは、次にある Bounds Directory(BD)-Bounds Table(BT) との整合性を付けたかったと思われる。

MPX は 4つしか区間情報を設定できないので、bounds 情報の入れ替えが必要になる。そのため仮想メモリ空間のアドレスに紐付ける形で区間情報のテーブルを作っておき、BNDLDX/BNDSTX 命令を使ってある仮想メモリ空間中の 1 点を指定してそのアドレスに紐付けられた区間情報を bounds register にロード可能にする。x86-64 は 64 ビットだが仮想アドレス空間は 48 ビットしかない。MMU/TLB は 4 段のページテーブルで処理しているが、MPX では 2 段の Bounds Directory(BD)-Bounds Table(BT) で処理する。48 ビット仮想アドレス空間の上位28ビット(47-20)を使って BD 中のエントリ(BDE)が引かれる。BD の大きさは 2GB で、BDE は 64-bit。BDE に BT へのポインタが入っている。仮想アドレスの残りの下位ビットで BT が検索され、BT 中のエントリ(BTE)が引かれる。BT は 4MB で、BTE は 256-bit (32 バイト)である。BTE には Upper bound、Lower bound、任意のデータが格納できる 64-bit スロットと、64-bit の予約領域からなる。BD も BT も物理アドレス空間ではなく、仮想メモリアドレス空間に配置する。

BD-BT 構造を用意するのが OS なのかライブラリなのか、どうやって使えばよいかフレームワークがはっきりしない。実際の CPU が出るまでにソフトウェア屋さんでいろいろ議論してちょーだいというスタンスなのかもしれない。

MPX は x86 のメモリアクセス命令一般のアドレスをチェックするのではなく、新設された BNDCL/BNDCU/BNDCN という境界チェック命令でのみチェックができる機構だった。そのためコンパイラJIT が MPX 命令をコード中に埋め込まないと効果がない機構だ。名前から期待できるものと実態が大分違う。

Processor Trace(PT)

Process Trace(PT) は CPU に関する様々なイベントを data packet という形でトレースする機能らしい。つまり何かイベントが発生すると、指定されたメモリ領域にイベント内容を記した data packet を順に書いてゆくという機能だ。
PT は将来を見据えた大きなフレームワークのようだが、まず control flow traceing 機能を用意とのこと。x86 にはデバッグ機能として Branch Trace Store(BTS) という機能があったが、PT は BTS の置き換えになるようにみえる。