Intel AVX

読み:インテル・エイヴィーエックス
外語:Intel Advanced Vector Extensions
品詞:名詞

Intelのプロセッサの開発コードネーム「Sandy Bridge」から搭載予定の拡張命令セット。

AVXはSIMD命令セットであり、SIMD演算命令であるMMX/SSEの延長線上にある。

演算幅は、従来のSSEの倍となる256ビットである。現在の128ビット長XMMレジスタは256ビット長に拡張され、これはYMMレジスタと呼ばれる。データロードも倍増され、従って理論上、CPUコアあたりの浮動小数点演算性能は倍になる。

更なる特徴は、新しい命令フォーマットを使用する点にある。

命令フォーマット

80x86系と呼ばれる一連のプロセッサは、16ビットマイクロプロセッサとして作られた8086の命令フォーマットを拡張した命令フォーマットを採用している。

IA-32にしろ、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によると、次のように説明されている。

  • (現在)
    • F2 REX 0F 58 ModRM ‐ ADDSD xmm9, xmm2
  • VEX使用時
    • C5 00110011 58 ModRM ‐ ADDSD xmm11, xmm9, xmm2
    • C4 010---01 00110011 58 ModRM ‐ ADDSD xmm11, xmm9, xmm15

C4とC5はそれぞれLES、LDS命令であるが、これらは利用できなくなるものと思われる。

また、C4の場合3ビットの予備がある。Intelによれば、3ビットあれば1,000以上の新命令を加えることが可能で、新しい命令、レジスタ、ベクタ長、殆ど何でも加えられる、としている。つまりこの方式であれば、当分は汚い拡張が不要になるということである。