ストリーミングSIMD拡張命令
概要
SSEは、x86アーキテクチャに8本の128ビットレジスタを新設し、浮動小数点演算のSIMD処理を実現したものである。AMDのK6-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/補足的なSSE3） 、SSE4がある。また、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を128ビット幅に拡張する整数演算命令の追加、キャッシュの制御機能の強化がなされた。
SSE2はPentium 4で初めて実装された。AMDのAMD64アーキテクチャでは、浮動小数点演算に従来のx87命令ではなくSSE/SSE2のスカラ演算命令を用いることを標準としたため、拡張命令ではなく基本命令としてSSE、SSE2が取り込まれている。
SSE3
SSE3はSSE2に13個の新たな命令が加えられた。具体的にはメモリアクセス及び複素数計算の高速化、仮想CPUのスレッドの動作制御などの機能が搭載され、主に動画圧縮の処理が向上した。
SSE3の名称が発表される前はPNI (Prescott New Instructions) と呼ばれていた。Pentium 4のPrescottコアで初めて実装された。
SSSE3
SSSE3はSSE3に32個の新たな命令が加えられた。
Coreマイクロアーキテクチャベースのマイクロプロセッサで初めて実装された。
SSSE3と名付けられる前はMNI (Merom New Instructions; 旧称Tejas New Instructions) という名称があった。登場当初はSSE4と呼ばれると一般的には思われていた。
SSE4.1
45nm世代のCore 2のPenrynで搭載。47個の命令が追加になる。
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に対応したプロセッサでは新規に導入された256ビット命令を使わなくても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の実装のように既存の128ビットの演算器を使って2サイクルで実行するようなことはせず、素直に乗算器や加算器などの演算器が256ビット幅に拡張されている。これによって、実質的なピーク浮動小数点演算性能がNehalem世代の2倍となっている。
AMDはBulldozer世代向けに当初予定していたSSE5拡張命令をキャンセルし、AMD FXではAVXがサポートされることになった。ただし、256ビット命令に関しては128ビット幅の演算器を2つ使って実行しており、スループットは従来のSSE命令と変わらない。
Intel AVX2
インテルはHaswellマイクロアーキテクチャから搭載。従来のSIMD整数演算命令が128ビットから256ビットに拡張されるのが主な変更点であるが、要素ごとに独立したシフト量を設定できるシフト命令、非連続なデータを並べ替えながらロードが可能なギャザー命令等の新たな命令も実装される。AMDはExcavatorアーキテクチャからAVX2を実装している。
Intel AVX-512
512ビット長のZMMレジスタを新設する。レジスタ数も16から32に増える。Knights LandingのXeon Phiに初めて搭載。
XeonプロセッサはSkylakeマイクロアーキテクチャから一部の命令を搭載。Xeon以外ではCore i9にも搭載されている。
FMA4
インテルが2008年に発表した時点でのFMA命令セット。完全な4オペランドを実現しており、3つのソースオペランドとディスティネーションオペランドを独立に指定できる。その後インテルは仕様を変更したために採用を取りやめたが、AMDはBulldozerマイクロアーキテクチャにおいてこの命令セットをサポートし続けていた。その後AMDが発表したZenマイクロアーキテクチャで削除されることとなった。
FMA3
インテルが2009年に仕様を変更し、現在使われているFMA命令セット。4オペランド方式をやめ、3つのソースオペランドのうち任意の1つを破壊することにより3オペランドでFMAを実現している。インテルはHaswellマイクロアーキテクチャ以降で、AMDはBulldozerマイクロアーキテクチャのPiledriverコア以降でサポートしている。なお、AMDが当初SSE5において採用したFMA命令も同じ3オペランド方式であった。
FMA4と比べるとレジスタの退避を行う必要がある場合に不利であるが、命令長を1バイト短くすることができるため、デコーダの実装や命令キャッシュのフットプリントでは有利である。インテルのIvy Bridgeマイクロアーキテクチャ以降やAMDのBulldozerマイクロアーキテクチャでは、レジスタ・リネーミングによってレジスタ間のmov命令をゼロレイテンシで実行できるため、これと組み合わせればレジスタ退避のペナルティは軽減できる。
インテルのマイクロプロセッサにおいてはAVX2命令と同時に採用されたため、AVX2命令の一部であると誤解されることがある。しかし、両者のCPUIDフラグは独立に設けられており、必ずしも両者が同時にサポートされているとは限らない（例えば、FMA3をサポートするAMDのPiledriverコアではAVX2命令はサポートしていない）。