Intel AVX
読み:インテル-エイヴィーエックス
外語:Intel Advanced Vector Extensions

 Intelのプロセッサーの開発コードネーム「Sandy Bridge」から搭載された、拡張命令セット。
目次

概要
 AVXはSIMD命令セットであり、SIMD演算命令であるMMX/SSEの延長線上にある。
 演算幅は、従来のSSEの倍となる256ビットである。現在の128ビット長XMMレジスターは256ビット長に拡張され、これはYMMレジスターと呼ばれる。つまり、SSEとAVXの各機構は、同じレジスターを共用する。
 レジスター長が倍となったことから、1回の命令で扱えるデータの数(データロード)も倍増された。単精度浮動小数点で8つ、倍精度浮動小数点なら4つまでを同時に演算できる。従って理論上、CPUコアあたりの浮動小数点演算性能は倍になる。
 また、従来のMMX/SSE命令は殆どが2オペランド命令だったが、AVXでは3オペランド命令または4オペランド命令が追加されている。このため、元の値を破壊しない演算が可能となった。
 更なる特徴は、これらを実現するために「VEXプリフィックス」を用いた、新しい命令フォーマットを使用する点にある。

特徴

機能の有無判別
 EAXレジスターに1を代入してCPUID命令を実行し、ECXレジスターに得られたフラグのビット28が1のとき、Intel AVXに対応する。
 IntelはSandy Bridge以降、AMDはBulldozer以降で対応する。

命令フォーマット
 x86系と呼ばれる一連のプロセッサーは、16ビットマイクロプロセッサーとして作られた8086の命令フォーマットを拡張した命令フォーマットを採用している。
 IA-32にしろ、x64(AMD64 ISA/Intel 64)にしろ、16ビット命令の前に命令プリフィックスを置いて命令を拡張する、という形式を取ってきた。
 理論上は幾らでも拡張可能だが、命令が複雑になるためデコード(解読)が難しくなる。このため、命令デコーダー(解読器)は肥大化し電力消費量の増大を招き、またCPUの高速化にとってもボトルネックとなってきた。
 拡張を重ねて汚くなる例として、SSE命令がある。元々は3バイト構成の命令セットであったが、データタイプの拡張のために1バイトのプリフィックスが追加され、更に64ビット化に伴いレジスターを8本追加するため1バイトのREXプリフィックスが追加され、結果最大で5バイトになった。すばらしい拡張性、と言えば聞こえは良いが、この命令の解読は容易なことではない。
 IntelはかつてIA-64で手痛い失敗はしているが、IA-32にも限界は来ており、早晩、何らかの対策は必要だろうと見られていた。

ペイロード
 AVXの新しいアプローチは、従来と互換性を持たせたまま、新しい命令フォーマットを導入することである。
 従来のように、1バイト長のプリフィックスを続々と重ねるという非効率な手法ではない。今回も新しいプリフィックスを追加はするが、この1バイト長のVEXプリフィックスには、続いて1〜2バイトのペイロードが置かれ、その後は従来どおりの命令が続く、という拡張が施されている。
 機械語コードは、ペイロード長が1の時はC5、ペイロード長が2の時はC4である。
 例えばIntelによると、次のように説明されている。
 C4とC5はそれぞれLES、LDS命令であるが、ビットの使い方を工夫することで共存が実現されている。
 また、C4の場合3ビットの予備がある。Intelによれば、3ビットあれば1,000以上の新命令を加えることが可能で、新しい命令、レジスター、ベクター長、殆ど何でも加えられる、としている。つまりこの方式であれば、当分は汚い拡張が不要になるということである。

再検索