Streaming SIMD Extensions

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

ストリーミングSIMD拡張命令 (Streaming SIMD Extensions, SSE) は、インテルが開発したCPUSIMD拡張命令セット、およびその拡張版の総称である。

概要[編集]

SSEは、x86アーキテクチャに8本の128ビットレジスタを新設し、浮動小数点演算のSIMD処理を実現したものである。AMDK6-2に実装されたSIMD拡張命令3DNow!に対抗する形でPentium IIIから実装された。4個の32ビット単精度浮動小数点データを一本のレジスタに格納し、同一の命令を一括処理することが出来る。拡張命令であるため、その機能を使用するためにはSSEに対応したソースコードを作成し、プログラムコンパイルする必要がある。

Core Duoまでのインテル製CPU、K8までのAMD製CPUでは、64ビット幅の演算機を用いて128ビット演算命令を2クロックかけて実行するという実装であったため、128ビット演算命令を用いても実質的なスループットはクロックあたり64ビットであった(SIMD整数演算に関してはPentium M、Core DuoやK8では64ビット幅の演算器を2つ持つため、コア全体でのSIMD整数演算のスループットは128ビット/クロックであった)。そのため従来から存在するMMX命令やAMDの3DNow!命令に対する性能面でのアドバンテージは128ビット幅のレジスタを使えるという点以外では小さく、むしろ並列度が上がった分だけ最適化も煩雑になるという欠点が目立った。また当時のRISC系CPUに搭載されているSIMD命令では128ビット演算命令を1クロックで実行できるものがあり、これらに対する性能的なディスアドバンテージは小さくなかった。最終的にはCoreマイクロアーキテクチャ/AMD K10より128ビット演算命令も1クロック処理が可能な形態へと改良され、SSE命令の実用性は大幅に向上した。

元々はインターネット・ストリーミング SIMD 拡張命令 (Internet Streaming SIMD Extensions, ISSE)と呼ばれていたが、命令内容そのものはインターネットとは直接関係が無くマーケティング的な要素が強かったため、現在ではインターネットの文字が外され単にSSEと呼ばれるようになっている。

SSEの機能を強化したものにSSE2やSSE3、SSSE3 (Supplemental Streaming SIMD Extensions 3) がある。また、SSEは他社製品にも採用されている。

SSE[編集]

Pentium III にはじめて実装された。追加された命令数は70。Pentium III の開発コードネームが Katmai であったことから、KNI (Katmai New Instructions) やMMX2とも呼ばれていた。廉価製品のCeleronにおいても、その第三世代製品 Coppermine-128k よりSSEに対応している。

AMDによるSIMD拡張命令セット、3DNow! プロフェッショナル・テクノロジは、SSEと互換性がある。

SSE2[編集]

SSE2は従来のSSEに144個の新たな命令が加えられた。具体的には64ビットの倍精度浮動小数点演算のサポート及びMMXを128Bit幅に拡張する整数演算命令の追加、キャッシュの制御機能の強化がなされた。

SSE2はPentium4で初めて実装された。AMDのAMD64アーキテクチャでは、浮動小数点演算に従来のx87命令ではなくSSE/SSE2のスカラ演算命令を用いることを標準としたため、拡張命令ではなく基本命令としてSSE、SSE2が取り込まれている。

SSE3[編集]

SSE3はSSE2に13個の新たな命令が加えられた。具体的にはメモリアクセス及び複素数計算の高速化、仮想CPUのスレッドの動作制御などの機能が搭載され、主に動画圧縮の処理が向上した。

SSE3の名称が発表される前はPNI (Prescott New Instructions) と呼ばれていた。Pentium4のPrescottコアで初めて実装された。

SSSE3[編集]

SSSE3はSSE3に32個の新たな命令が加えられた。 Coreマイクロアーキテクチャベースのマイクロプロセッサで初めて実装された。

SSSE3と名付けられる前はMNI (Merom New Instructions; 旧称Tejas New Instructions) という名称があった。登場当初はSSE4と呼ばれると一般的には思われていた。

SSE 4[編集]

SSE4.1[編集]

45nm世代の Core 2 の Penryn で搭載。47個の命令が追加になる。

SSE4.2[編集]

Nehalemマイクロアーキテクチャ の第1世代 Intel Core i で初めて実装された。7個の命令を追加。SSE 4.2 の追加命令は以下の通り。

  • String & Text New Instructions (STTNI)
    • PCMPESTRI
    • PCMPESTRM
    • PCMPISTRI
    • PCMPISTRM
    • PCMPGTQ
  • Application Targeted Accelerators (ATA)
    • CRC-32
    • POPCNT - ビットが立っている数を数える

SSE4a[編集]

AMD Phenomで搭載。 キャッシュ関連や挿入、展開の4命令が追加。インテルのSSE4とは名前は似ているが互換性は無い。

Intel AVX[編集]

MMX/SSE後継のSIMD拡張命令セットで、呼称がIntel Advanced Vector eXtensionsとなった。Sandy Bridgeマイクロアーキテクチャで初めて搭載された。浮動小数点演算の演算幅がSSEの2倍の256ビットとなり、1命令で8つの単精度浮動小数点演算もしくは4つの倍精度浮動小数点演算を実行することができる。また、命令デコード性能向上のため、新しい命令フォーマット (VEXエンコーディング) が採用されている。3 or 4オペランドの非破壊型命令もサポートするため、レジスタ退避・復元処理の記述を省くことができる。この非破壊型の命令フォーマットに関しては従来の128ビット幅のSSE命令にも使うことができるため、AVXに対応したプロセッサでは新規に導入された256Bit命令を使わなくてもSIMD演算の性能が向上する可能性がある。

SSEが導入された際には専用の128ビットレジスタが新設されたが、AVXの256ビットレジスタは下位の128ビットを既存のSSEレジスタと共有している。そのためSSE命令とAVX命令の間でのデータ交換は容易である。ただし、256ビットのAVX命令と既存のSSE命令を混在させると、SSE命令を実行する際にAVXレジスタの上位128ビットを退避するというペナルティが発生するため、パフォーマンスが落ちる。これを避けるためには、256ビット命令の実行後にVZEROUPPER/VZEROALL命令を実行して明示的にAVXレジスタの上位128ビットをクリアするか、SSE命令をVEXエンコーディングを使ったものに置き換える必要がある。VEXエンコーディングの128ビット命令はAVXレジスタの上位128ビットを保持せずにゼロクリアするという挙動になっており、AVXレジスタの部分的な書き換えが発生しないためである。

Sandy Bridgeでは当初のSSEの実装のように既存の128Bitの演算器を使って2サイクルで実行するようなことはせず、素直に乗算器や加算器などの演算器が256Bit幅に拡張されている。これによって、実質的なピーク浮動小数点演算性能がNehalem世代の2倍となっている。

AMDはBulldozer世代向けに当初予定していたSSE5拡張命令をキャンセルし、AMD FXではAVXがサポートされることになった。ただし、256ビット命令に関しては128ビット幅の演算器を2つ使って実行しており、スループットは従来のSSE命令と変わらない。

Intel AVX2[編集]

インテルはHaswellマイクロアーキテクチャ から搭載。従来のSIMD整数演算命令が128ビットから256ビットに拡張されるのが主な変更点であるが、要素ごとに独立したシフト量を設定できるシフト命令、非連続なデータを並べ替えながらロードが可能なギャザー命令等の新たな命令も実装される。

FMA (Fused Multiply-Add)[編集]

x86プロセッサにおいて積和演算を実現するための拡張命令がFMAである。2007年にAMDがSSE5命令の一部として、2008年にIntelがAVX命令のサブセットとして採用を発表したが、両者の仕様は異なるものであった。その後、Intelは2009年初頭にFMA命令の仕様を変更し、4オペランド (FMA4) をやめ3オペランド形式 (FMA3) とした。2009年5月にはAMDがSSE5命令の採用を取りやめ、AVXのサポートを表明したため、仕様の統一が図られたかと思われたが、FMA命令に関してはIntelが仕様を変更する前の4オペランド版FMAを採用したため、FMA4とFMA3という二系統のFMA命令が混在したまま現在に至っている。

FMA命令では±(A×B)±Cの形で表現される単精度/倍精度の浮動小数点演算を1命令で実行できる。乗算結果の符号を反転するか、乗算後に加算を行うか減算を行うかによって以下の4つのバリエーションがある。

MADD
A×B+C
MSUB
A×B-C
NMADD
-(A×B)+C
NMSUB
-(A×B)-C

いずれの命令も単精度/倍精度、スカラ/ベクタを問わず全てのタイプの演算に適用可能である。他にもベクタ専用のMADDSUB命令が存在し、1,3,5...番目の要素にMADDを、0,2,4...番目の要素にMSUBを行うという命令になっている。

FMA命令に対応した演算器においては、上記の浮動小数点演算を1クロックサイクルのスループットで実行可能で、加算のみ、乗算のみを実行できる演算器と比較すると理論FLOPSを倍にすることができる。また、乗算の結果に対しては丸めを行わず、加算を行った後に一度だけ丸めを行うため、乗算と加算を独立して実行するのと比較して丸め誤差を小さくできるという利点もある。実装としてはAMDのBulldozerマイクロアーキテクチャでサポートされたのが最初で、モジュールあたり2つの128ビットFMA演算器を搭載している。IntelはHaswellマイクロアーキテクチャで初めてサポートしており、コアあたり2つの256ビットFMA演算器を搭載している。

(注記:乗算と加算あるいは減算を融合させた命令はAMDのBulldozer以前にも,HP社のPA-RISCやIBM社のPower、PowerPC、Intel社のItaniumにも実装されていた。)

FMA4[編集]

Intelが2008年に発表した時点でのFMA命令セット。完全な4オペランドを実現しており、3つのソースオペランドとディスティネーションオペランドを独立に指定できる。その後Intelは仕様を変更したために採用を取りやめたが、AMDはBulldozerマイクロアーキテクチャにおいてこの命令セットをサポートしている。

FMA3[編集]

Intelが2009年に仕様を変更し、現在使われているFMA命令セット。4オペランド方式をやめ、3つのソースオペランドのうち任意の1つを破壊することにより3オペランドでFMAを実現している。IntelはHaswellマイクロアーキテクチャ以降で、AMDはBulldozerマイクロアーキテクチャのPiledriverコア以降でサポートしている。なお、AMDが当初SSE5において採用したFMA命令も同じ3オペランド方式であった。

FMA4と比べるとレジスタの退避を行う必要がある場合に不利であるが、命令長を1バイト短くすることができるため、デコーダの実装や命令キャッシュのフットプリントでは有利である。IntelのIvy Bridgeマイクロアーキテクチャ以降やAMDのBulldozerマイクロアーキテクチャでは、レジスタ・リネーミングによってレジスタ間のmov命令をゼロレイテンシで実行できるため、これと組み合わせればレジスタ退避のペナルティは軽減できる。

IntelのマイクロプロセッサにおいてはAVX2命令と同時に採用されたため、AVX2命令の一部であると誤解されることがある。しかし、両者のCPUIDフラグは独立に設けられており、命令セットとしては別のものである (例えば、FMA3をサポートするAMDのPiledriverコアではAVX2命令はサポートしていない)。

歴史[編集]

関連項目[編集]