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によると、次のように説明されている。
(現在)
F2 REX 0F 58 ModR/M ‐ ADDSD xmm9, xmm2
VEX使用時
C5 00110011 58 ModR/M ‐ ADDSD xmm11, xmm9, xmm2
C4 010---01 00110011 58 ModR/M ‐ ADDSD xmm11, xmm9, xmm15
C4とC5はそれぞれLES、LDS命令であるが、ビットの使い方を工夫することで共存が実現されている。
また、C4の場合3ビットの予備がある。Intelによれば、3ビットあれば1,000以上の新命令を加えることが可能で、新しい命令、レジスター、ベクター長、殆ど何でも加えられる、としている。つまりこの方式であれば、当分は汚い拡張が不要になるということである。
再検索