コンピューティングにおいて、ストリーミング SIMD 拡張命令( 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 つの大きな問題がありました。既存のx87浮動小数点レジスタを再利用するため、CPU が浮動小数点データと SIMD データの両方を同時に処理できないことと、整数データしか処理できないことです。SSE 浮動小数点命令は、新しい独立したレジスタセットである XMM レジスタを操作し、MMX レジスタで動作する整数命令をいくつか追加しました。
SSEはその後、IntelによってSSE2、SSE3、SSSE3、そしてSSE4へと拡張されました。浮動小数点演算をサポートしているため、MMXよりも幅広い用途に利用され、より普及しました。SSE2に整数演算のサポートが追加されたことで、MMXはほぼ不要になりましたが、状況によってはMMXをSSE演算と並行して使用することで、 さらなるパフォーマンス向上を実現できます(いつ?) 。
SSEは当初Katmai New Instructions(KNI)と呼ばれていました。KatmaiはPentium IIIコアの最初のリビジョンのコード名でした。Katmaiプロジェクトにおいて、IntelはSSEを以前の製品ライン、特に主力製品であるPentium IIとの区別に努めました。その後、SSEは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レジスタ状態を一度に保存できる拡張命令ペアである命令と命令の使用方法を認識している必要があります。このサポートは、すべての主要なIA-32オペレーティングシステムに迅速に追加されました。
FXSAVEFXRSTOR
SSEをサポートした最初のCPUであるPentium IIIは、SSEと浮動小数点ユニット(FPU)間で実行リソースを共有していました。[2]コンパイルされたアプリケーションはFPU命令とSSE命令を並べてインターリーブできますが、Pentium IIIはFPU命令とSSE命令を同じクロックサイクルで発行しません。この制限によりパイプラインの有効性は低下しますが、独立したXMMレジスタにより、明示的なMMX/浮動小数点モードの切り替えによるパフォーマンスの低下なしに、SIMD演算とスカラー浮動小数点演算を混在させることができます。
SSE では、スカラー命令とパック浮動小数点命令の 両方が導入されました。
RSQRTSS浮動小数点演算は、標準で指定されていない
を除いて、IEEE 754-1985 に準拠しています。
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命令に相当します。一方、以下の擬似コードが示すように、128ビットの「パックド加算」命令1つで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 ;xmm0
popcnt命令( Population count : 1 に設定されたビットの数をカウント。暗号化などで広く使用される) などが追加されています。以下のプログラムを使用すると、システムでサポートされているSSEのバージョン(存在する場合)を判別できます。