ストリーミングSIMD拡張命令(、略称:SSE)は、インテルが開発したCPUのSIMD拡張命令セット、およびその拡張版の総称である。後継の Advanced Vector Extensions (AVX) と Advanced Matrix Extensions (AMX) についても本項で記載する。
概要 SSEは、x86アーキテクチャに8本の128ビットレジスタを新設し、浮動小数点演算のSIMD処理を実現したものである。AMDのK6-2に実装されたSIMD拡張命令3DNow!に対抗する形でPentium IIIから実装された。4個の32ビット単精度浮動小数点データを一本のレジスタに格納し、同一の命令を一括処理することができる。拡張命令であるため、その機能を使用するためにはSSEに対応したソースコードを作成し、プログラムをコンパイルする必要がある。伝統的なベクトル型CPUと比較したときにいくつかの仕様が欠落(例えば可変長ベクトルが扱えない,疎行列に弱いなど)しているものの、ベクトル計算をサポートする機能ではある。x86アーキテクチャのCPUは本質的にはスカラー計算機であるが、SSEやAVXの使用により簡易的なベクトル計算機として機能するようになる。SSEやAVXを用いて並列化を行うことをベクトル化と呼ぶ。
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拡張命令(、ISSE)と呼ばれていたが 、命令内容そのものはインターネットとは直接関係が無くマーケティング的な要素が強かったため、現在ではインターネットの文言が外され単にSSEと呼ばれるようになっている。
SSEの機能を強化したものにSSE2やSSE3、SSSE3(Supplemental/補足的なSSE3)、SSE4がある。また、SSEは他社製品にも採用されている。SSEの後継はAVXである。
1命令で複数個の処理を並列化でき、スレッドに頼らず飛躍的な性能向上が図れることから、現代のコンパイラにおいては主流の最適化の手法であり、O2やO3の最適化オプションを付与すると積極的にベクタライズが行われる。
実際の利用方法 SSEやAVXでは128bit,256bit,512bitなどの長いレジスタを扱えるようになるが、メモリアラインメントやエイリアスの強い制約があるため、アセンブラを手書きして性能を引き出すためには高度な(世界トップクラスのプログラマですら習得が困難な)プログラミング技術が要求されるため、一般的にはコンパイラの自動ベクトル化機能を介して利用することになる。非常に大規模な並列化を行う場合はGPGPUに移行することもあるが、SIMD命令はCPUに内蔵される機能であるため、追加の演算装置が必要ないことや、GPGPUと比較した場合にレイテンシが少ないという利点はある。特に、ゲームにおいてはGPUが描画に使われるため、GPGPUよりSIMD命令の方が優先されることが多い。SIMD命令の実行によって同時に複数の演算回路が動くとCPUの消費電力は大幅に増える(レジスタ長が長いほど問題が大きくなる)ため、使用しない特殊なケースもあるが、一般的にはコンパイラの判断に任せることで適度な使用が期待される。
導入書籍 低レベルプログラミングは、x86/x64アーキテクチャのアセンブラについて初歩から記載した導入書籍である。下記の公式マニュアルと併せて利用すること。アセンブラを扱う開発者が少ない関係で、情報が古いことも多いため、検索エンジンを用いて命令の記述を検索することは避けるべきであるとすることもある。が、一般的に最新のリファレンスは公式のマニュアルをあたるべきである。
公式マニュアル 下記の公式マニュアルにSSEとAVXを含めたx86/x64アーキテクチャについての全ての仕様が網羅されているため、実際の開発においては下記を参照すること。下記は唯一かつ確実な情報源である。x86/x64アーキテクチャの全ての仕様を網羅した上でのアセンブラの取り扱いは一般的にはコンパイラが行うようなことであるため、本格的なソフトウェア開発においてはインテルコンパイラの導入も検討すること。
Intel® 64 and IA-32 Architectures Software Developer Manualsに、アセンブラについての全ての仕様が記載されている。
Intel® 64 and IA-32 Architectures Optimizationには、あらゆる命令を使用したベクトル化を含む最適化方法が記載されている。
沿革 1999年 2月: インテルがSSE搭載のPentium IIIプロセッサを発表。 2000年 3月: インテルがSSE搭載のCeleronプロセッサを発表。 2000年 11月: インテルがSSE2搭載のPentium 4プロセッサを発表。 2002年 5月: インテルがSSE2搭載のCeleronプロセッサを発表。 2003年 3月: インテルがSSE2搭載のPentium Mプロセッサを発表。 2004年 1月: インテルがSSE2搭載のCeleron Mプロセッサを発表。 2004年 2月: インテルがSSE3搭載のPentium 4プロセッサを発表。 2004年 6月: インテルがSSE3搭載のCeleron Dプロセッサを発表。 2006年 1月: インテルがSSE3搭載のIntel Coreプロセッサを発表。 2006年 6月: インテルがSSSE3搭載のXeon 5100プロセッサを発表。 2006年 7月: インテルがSSSE3搭載のIntel Core 2プロセッサを発表。 2007年 8月: AMDがSSE5を発表。 2007年 11月: インテルがSSE4.1搭載のIntel Core 2プロセッサを発表。 2007年 11月: AMDがSSE4a搭載のPhenomを発表。 2008年 11月: インテルがSSE4.2搭載の第一世代Intel Core i7プロセッサを発表。 2011年 1月: インテルがAVX搭載の第二世代Intel Core i7プロセッサを発表。 2011年 10月: AMDがFMA搭載のAMD FXプロセッサを発表。 2013年 6月: インテルがAVX2搭載の第四世代Intel Core i7プロセッサを発表。 2016年 6月: インテルがAVX-512搭載の第二世代Intel Xeon Phiコプロセッサを発表。 2023年 1月: インテルがAMX搭載の第四世代Intel Xeon SPを発表。
Pentium IIIにはじめて実装された。追加された命令数は70。Pentium IIIの開発コードネームがKatmaiであったことから、KNI () やMMX2 とも呼ばれていた。廉価製品のCeleronにおいても、その第三世代製品 Coppermine-128k よりSSEに対応している。
AMDによるSIMD拡張命令セット3DNow! Professionalは、SSEと互換性がある。
SSE2は従来のSSEに144個の新たな命令が加えられた。具体的には64ビットの倍精度浮動小数点演算のサポートおよびMMXを128ビット幅に拡張する整数演算命令の追加、キャッシュの制御機能の強化がなされた。
SSE2はPentium 4で初めて実装された。AMDのAMD64アーキテクチャでは、浮動小数点演算に従来のx87命令ではなくSSE/SSE2のスカラ演算命令を用いることを標準としたため、拡張命令ではなく基本命令としてSSE、SSE2が取り込まれている。
SSE3はSSE2に13個の新たな命令が加えられた。具体的にはメモリアクセスおよび複素数計算の高速化、仮想CPUのスレッドの動作制御などの機能が搭載され、主に動画圧縮の処理が向上した。
SSE3の名称が発表される前はPNI () と呼ばれていた。Pentium 4のPrescottコア(2004年 -)で初めて実装された。
SSSE3 () はSSE3に32個の新たな命令が加えられた。 CoreマイクロアーキテクチャベースのマイクロプロセッサIntel Core 2 (Conroe) / Intel Xeon (Woodcrest) で初めて実装された。
SSSE3と名付けられる前はMNI (; 旧称) という名称があった。登場当初はSSE4と呼ばれると一般的には思われていた。
45nm世代のCore 2のPenrynで搭載。47個の命令が追加になる。
Nehalemマイクロアーキテクチャの第1世代Intel Core iで初めて実装された。7個の命令を追加。SSE 4.2の追加命令は以下の通り。 (STTNI) PCMPESTRI PCMPESTRM PCMPISTRI PCMPISTRM PCMPGTQ (ATA) CRC-32 POPCNT - ビットが立っている数を数える
AMD Phenomで搭載。 キャッシュ関連や挿入、展開の4命令が追加。インテルのSSE4とは名前は似ているが互換性は無い。
x86プロセッサにおいて融合積和演算を実現するための拡張命令乗算と加算あるいは減算を融合させた命令はAMDのBulldozer以前にも、HPのPA-RISCやIBMのPower、PowerPC、インテルのItaniumにも実装されていた。がFused Multiply-Add (FMA)である。2007年にAMDがSSE5命令の一部として、2008年にインテルがAVX命令のサブセットとして採用を発表したが、両者の仕様は異なるものであった。その後、インテルは2009年初頭にFMA命令の仕様を変更し、4オペランド (FMA4) をやめ3オペランド形式 (FMA3) とした。2009年5月にはAMDがSSE5命令の採用を取りやめ、AVXのサポートを表明したため、仕様の統一が図られたかと思われたが、FMA命令に関してはインテルが仕様を変更する前の4オペランド版FMAを採用したため、FMA4とFMA3という二系統のFMA命令が混在していた。その後、AMDがZenマイクロアーキテクチャでFMA4の削除およびサポートの打ち切りを表明したことで、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演算器を搭載している。インテルはHaswellマイクロアーキテクチャで初めてサポートしており、コアあたり2つの256ビットFMA演算器を搭載している。
インテルが2008年に発表した時点でのFMA命令セット。完全な4オペランドを実現しており、3つのソースオペランドとディスティネーションオペランドを独立に指定できる。その後インテルは仕様を変更したために採用を取りやめたが、AMDはBulldozerマイクロアーキテクチャにおいてこの命令セットをサポートし続けていた。その後AMDが発表したZenマイクロアーキテクチャで削除されることとなった。
インテルが2009年に仕様を変更し、現在使われているFMA命令セット(FMA instruction set"CHAPTER 6 INSTRUCTION SET REFERENCE - FMA ... FMA INSTRUCTION SET ... Performs a set of SIMD multiply-add computation on packed" Intel. Intel® Architecture Instruction Set Extensions Programming Reference. pp.6_1-6_2.)。4オペランド方式をやめ、3つのソースオペランドのうち任意の1つを破壊することにより3オペランドでFMAを実現している。インテルはHaswellマイクロアーキテクチャ以降で、AMDはBulldozerマイクロアーキテクチャのPiledriverコア以降でサポートしている。なお、AMDが当初SSE5において採用したFMA命令も同じ3オペランド方式であった。
ベーシックなmm256_fmadd_ps命令の場合、Intel CPUで1サイクルあたり16個の単精度FMA演算を実行する"to sustain Haswell’s CPU peak (e.g., 16 multiply-adds per cycle)" 田浦. (2016). What You Must Know about Memory, Caches, and Shared Memory. 並列分散プログラミング, 東京大学."Intel® AVX 2.0 delivers 16 double precision and 32 single precision floating point operations per second per clock cycle within the 256-bit vectors, with up to two 256-bit fused-multiply add (FMA) units." Intel. Intel® Advanced Vector Extensions 512. 2022-04-04閲覧. (256 [bit/inst.] ÷ 32 [bit/fp32FMA] ÷ 0.5 [CPI=cycle/inst.]"__m256 _mm256_fmadd_ps ... Throughput (CPI) ... Haswell ... 0.5" Intel Intrinsics Guide. 2022-04-03閲覧.)。例えば3GHzで動作するプロセッサであれば1コア当たり 48 GMAC/s (=96 GFLOPS) のピーク性能を可能にする(参考: FLOPS#代表的なハードウェアの浮動小数点数演算能力)。
FMA4と比べるとレジスタの退避を行う必要がある場合に不利であるが、命令長を1バイト短くすることができるため、デコーダの実装や命令キャッシュのフットプリントでは有利である。インテルのIvy Bridgeマイクロアーキテクチャ以降やAMDのBulldozerマイクロアーキテクチャでは、レジスタ・リネーミングによってレジスタ間のmov命令をゼロレイテンシで実行できるため、これと組み合わせればレジスタ退避のペナルティは軽減できる。
インテルのマイクロプロセッサにおいてはAVX2命令と同時に採用されたため、AVX2命令の一部であると誤解されることがある。しかし、両者のCPUIDフラグは独立に設けられており"12 FMA ... 28 AVX" Intel. (2021). Intel® Architecture Instruction Set Extensions and Future Features. p.1_27.、必ずしも両者が同時にサポートされているとは限らない(例えば、FMA3をサポートするAMDのPiledriverコアではAVX2命令はサポートしていない)。
Intel MMX/SSE後継のSIMD拡張命令セットで、呼称がとなった。Sandy Bridgeマイクロアーキテクチャ(2011年 -)で初めて搭載された。浮動小数点演算の演算幅が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はAVXの後続となる256ビットレジスタ対象の拡張命令セットである。
命令 256ビットレジスタ上の整数ベクトルに対する算術 (add, sub, mul, madd, abs, sad, sign)、比較(eq, gt)、統計 (ave, min, max)、論理 (and, or, xor, andnot) 、シフト (sll, sra, srl, alignr)、変換 (convert)、要素操作/swizzle (permute, shuffle, broadcast, insert, blend, unpack, pack, extract) をサポートする。また整数ベクトルの入出力 (stream load, masked load/store)、マスク生成 (movemask) も追加されている。シフト命令は要素ごとに独立したシフト量を設定できる。
浮動小数点ベクトルにも影響する命令としてはgather命令(非連続なデータを並べ替えながらロード)が導入されている。
対応 インテルはHaswellマイクロアーキテクチャから搭載している。AMDはExcavatorアーキテクチャからAVX2を実装している。ただし、SIMD演算ユニット自体はZen+まで128bit幅に留まっていたため、AVX2命令を多用する処理はあまり高速化されていなかった。Zen2世代からは256bit幅になり処理速度が改善されている。
実装としてIntel CPUではベクトルレジスタとベクトル用実行ユニットを用いて計算される。例としてint8積和演算(VNNI等価)では"Vec Mul"および"Vec ALU"実行ユニットが典型的に利用される(下表)。 +表. Intel CPU AVX2におけるint8積和演算 (pseudo VNNI) 実装μarch実行ユニット VPMADDUBSW, VPMADDWDVPADDDHaswell"SIMD Misc" x1"Haswellマイクロアーキテクチャの実行ユニット ... Execution Unit ... SIMD Misc ... # of Ports ... 1 ... Instructions ... (v)pmadd*" p.32 of Intel. (2017). Intel® 64 and IA-32 Architectures Optimization Reference Manual. Order Number: 248966-037 July 2017. iSUS訳."SIMD ALU" x2"Haswellマイクロアーキテクチャの実行ユニット ... Execution Unit ... SIMD ALU ... # of Ports ... 2 ... Instructions ... (v)padd*" p.32 of Intel. (2017). Intel® 64 and IA-32 Architectures Optimization Reference Manual. Order Number: 248966-037 July 2017. iSUS訳. (Port 1, 5)Skylake"Vec Mul" x2"Skylake Client Microarchitecture Execution Units ... Execution Unit ... Vec Mul ... # of Unit ... 2 ... Instructions ... (v)pmadd*" p.2_27 of Intel. (2022). Intel® 64 and IA-32 Architectures Optimization Reference Manual. Order Number: 248966-045 February 2022. (Port 0, 1)"Vec ALU" x3"Skylake Client Microarchitecture Execution Units ... Execution Unit ... Vec ALU ... # of Unit ... 3 ... Instructions ... (v)paddb/w/d/q" p.2_27 of Intel. (2022). Intel® 64 and IA-32 Architectures Optimization Reference Manual. Order Number: 248966-045 February 2022. (Port 0, 1, 5)Sunny Cove"Vec Mul" x2"Ice Lake Client Microarchitecture Execution Units ... Execution Unit ... Vec Mul ... # of Unit ... 2 ... Instructions ... (v)pmadd*" p.2_13 of Intel. (2022). Intel® 64 and IA-32 Architectures Optimization Reference Manual. Order Number: 248966-045 February 2022."Vec ALU" x3"Ice Lake Client Microarchitecture Execution Units ... Execution Unit ... Vec ALU ... # of Unit ... 3 ... Instructions ... (v)paddb/w/d/q" p.2_13 of Intel. (2022). Intel® 64 and IA-32 Architectures Optimization Reference Manual. Order Number: 248966-045 February 2022. (Port 0, 1, 5)"Vec Mul/FMA" x2"Golden Cove Microarchitecture Execution Units ... Execution Unit ... Vec Mul/FMA ... # of Unit ... 2x256-bit (1 or 2)x512-bit ... Instructions ... (v)pmadd*" p.2_9 of Intel. (2022). Intel® 64 and IA-32 Architectures Optimization Reference Manual. Order Number: 248966-045 February 2022. (Port 0, 1)"Vec ALU" x3"Golden Cove Microarchitecture Execution Units ... Execution Unit ... Vec ALU ... # of Unit ... 3x256-bit ... Instructions ... (v)paddb/w/d/q" p.2_8 of Intel. (2022). Intel® 64 and IA-32 Architectures Optimization Reference Manual. Order Number: 248966-045 February 2022. (Port 0, 1, 5)
AVX2 VNNI