コンピューティングにおいて、Streaming SIMD Extensions ( SSE ) は、 x86アーキテクチャに対する単一命令複数データ ( SIMD )命令セット拡張であり、 Intelによって設計され、 Advanced Micro Devices (AMD) の3DNow!の登場直後の 1999 年に同社のPentium IIIシリーズの中央処理装置(CPU) に導入されました。SSE には 70 の新しい命令 (70 のエンコーディングを使用した 65 の固有のニーモニック[ 1 ] ) が含まれており、そのほとんどは単精度浮動小数点データで動作します。SIMD 命令は、まったく同じ操作を複数のデータ オブジェクトで実行する場合にパフォーマンスを大幅に向上させることができます。典型的なアプリケーションは、デジタル信号処理とグラフィックス処理です。
Intelが最初に開発したIA-32 SIMDは、MMX命令セットでした。MMXには主に2つの問題がありました。1つは、既存のx87浮動小数点レジスタを再利用していたため、CPUが浮動小数点データとSIMDデータを同時に処理できなかったこと、もう1つは、整数しか扱えなかったことです。SSE浮動小数点命令は、新しい独立したレジスタセットであるXMMレジスタ上で動作し、MMXレジスタ上で動作するいくつかの整数命令も追加されています。
SSEはその後、IntelによってSSE2、SSE3、SSSE3、SSE4へと拡張されました。浮動小数点演算をサポートしているため、MMXよりも幅広い用途で利用され、より普及しました。SSE2で整数演算が追加されたことでMMXはほぼ不要になりましたが、状況によってはMMXとSSE演算を並列で使用することで、さらなるパフォーマンス向上を実現できます。
SSE は当初Katmai New Instructions ( KNI ) と呼ばれていました。Katmaiは最初の Pentium III コア改訂版のコードネームです。Katmai プロジェクトでは、Intel はこれを以前の製品ライン、特に主力製品であるPentium IIと区別しようとしました。その後、 Internet Streaming SIMD Extensions ( ISSE [ 2 ] )と改名され、さらに SSE となりました。
AMD は、1999年8 月に初代 Athlon をリリースした直後に、SSE のサブセットである 19 個の命令を新しい MMX 命令[ 3 ]として追加しました。これは、SSE と MMX のいくつかのバリアントや組み合わせ、またはInteger SSE ( ISSE 、 SSE の初期の名前であるInternet Streaming SIMD Extensionsと混同しないように) として知られています( 3DNow! 拡張機能を参照)。AMD は最終的に、Athlon XP ( CorvetteおよびPalominoコア) およびDuron ( Morganコア) プロセッサから、 SSE 命令 ( 3DNow! Professionalと呼ばれることもあります) の完全なサポートを追加しました。
XMM0SSE は当初、からと呼ばれる 8 つの新しい 128 ビット レジスタを追加しましたXMM7。AMDのAMD64XMM8拡張機能は、から までのさらに 8 つのレジスタを追加しXMM15、この拡張機能はIntel 64アーキテクチャにも複製されています。また、新しい 32 ビット制御/ステータス レジスタ もあります。から までのMXCSRレジスタは、64 ビット動作モードでのみアクセス可能です。XMM8XMM15

SSEはXMMレジスタに単一のデータ型のみを使用しました。
SSE2は後にXMMレジスタの使用範囲を拡張し、以下の機能を追加することになった。
これらの128ビットレジスタは、オペレーティングシステムがタスク切り替え後も保持しなければならない追加のマシン状態であるため、オペレーティングシステムが明示的に有効にするまでデフォルトでは無効になっています。つまり、OSは、すべてのx86およびSSEレジスタ状態を一度に保存できる拡張命令ペアである`set`および`set`命令のFXSAVE使い方を知っている必要があります。このサポートは、主要なIA-32オペレーティングシステムすべてにすぐに追加されました。FXRSTOR
SSE を最初にサポートした CPU であるPentium IIIは、SSE と浮動小数点演算ユニット(FPU) の間で実行リソースを共有していました。[ 2 ]コンパイルされたアプリケーションは FPU 命令と SSE 命令を並行してインターリーブできますが、Pentium III は同じクロックサイクルで FPU 命令と SSE 命令を発行しません。この制限によりパイプライン処理の有効性は低下しますが、独立した XMM レジスタにより、明示的な MMX/浮動小数点モード切り替えによるパフォーマンス低下なしに SIMD とスカラー浮動小数点演算を混在させることができます。
SSEは、スカラー浮動小数点命令とパック浮動小数点命令の両方を導入した。
浮動小数点演算は、IEEE 754-1985 に準拠していますが、例外としてRSQRTSS、この規格では規定されていない があります。
MOVSSMOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS, MOVMSKPSADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSSADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPSCMPSS, COMISS, UCOMISSCMPPSSHUFPS, UNPCKHPS, UNPCKLPSCVTSI2SS, CVTSS2SI, CVTTSS2SICVTPI2PS, CVTPS2PI, CVTTPS2PIANDPS, ORPS, XORPS, ANDNPSPMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSWPEXTRW, PINSRWPMOVMSKB, PSHUFWMXCSR管理 LDMXCSR, STMXCSRMOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE次の簡単な例は、SSEを使用する利点を示しています。コンピュータグラフィックスアプリケーションで非常によく使用されるベクトル加算のような演算を考えてみましょう。x86を使用して2つの単精度4成分ベクトルを加算するには、4つの浮動小数点加算命令が必要です。
vec_res.x = v1.x + v2.x ; vec_res.y = v1.y + v2.y ; vec_res.z = v1.z + v2.z ; vec_res.w = v1.w + v2.w ;これは、オブジェクトコードでは4つのx86 FADD命令に相当します。一方、以下の擬似コードに示すように、1つの128ビット「パックド加算」命令で4つのスカラー加算命令を置き換えることができます。
movaps xmm0 , [ v1 ] ;xmm0 = v1.w | v1.z | v1.y | v1.x addps xmm0 , [ v2 ] ;xmm0 = v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x movaps [ vec_res ], xmm0 ;xmm0popcnt命令(人口カウント: 1 に設定されているビットの数をカウントし、暗号化などで広く使用されています) などを追加する、もう 1 つの大きな機能強化です。以下のプログラムを使用すると、システムでサポートされているSSEのバージョン(もしあれば)を特定できます。