SSE
読み:エスエスイー
外語:SSE: Streaming SIMD Extensions
ストリーミングSIMD拡張命令。
Intel
の
マイクロプロセッサー
である
Pentium III
から搭載された命令群のこと。
目次
概要
特徴
沿革
SSE
SSE2
SSE3
SSSE3
SSE 4.1
SSE 4.2
SSE4a
SSE5
Intel AVX
Intel AVX2
機能の有無判別
新命令
概要
新たに128ビット長の
XMMレジスター
8本を新設し、これを用いて
SIMD
命令を処理する。
一つのレジスターに32ビットの単精度浮動小数点数を4つまで格納可能で、同一の演算命令を一括処理できる。かくして浮動小数点演算の大幅な高速化を実現した。
マルチタスクOS
または
マルチスレッドOS
の場合は、
タスク
/
スレッド
切り換え時にレジスターの待避と復元処理をせねばならないが、レジスターが増えているという都合から、未対応の古いOSでは使用することができない。
SSE以降も続々と機能が拡張され、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2などと続いている。
特徴
沿革
SSE
Pentium IIIから搭載された、最初のSSEである。追加命令数は70で、開発中には
KNI
やMMX2とも呼ばれていた。
AMD主導の拡張命令である
3DNow! Professional
は、このSSEに対応している。
SSE2
Pentium 4
(
Willamette
コアと
Northwood
コア)から搭載された。追加命令数は144で、倍精度浮動小数点演算や整数演算などに対応した。
AMDでは、
AMD64
で標準命令として取り込まれている。
SSE3
Pentium 4の第三世代プロセッサーコア
Prescott
から搭載された。
追加命令数は13に過ぎないが、複素数演算やメモリーアクセスなどの高速化が図られており、ビデオエンコーディングなどの処理能力が向上している。
SSSE3
SSE3に対する拡張で、追加命令数は16である。
特に、水平加算などが追加されたため、内積計算などが高速化された。
SSE 4.1
Core 2の新コア
Penryn
から搭載された。追加命令数は47である。
様々なメディア処理、画像処理、3D処理のパフォーマンス向上を目的とした命令が追加されている。
SSE 4.2
Core i7
(
Nehalem
コア)から搭載された。追加命令数は7である。
XML解析用の文字列検索命令や、CRC32演算命令といった、サーバー向けの命令が追加されている。
SSE4a
AMD独自の命令で、AMD K8Lから追加された。名前こそSSE4となっているが、IntelのSSE4とは全く無関係である。
SSE5
AMDが追加を予定していたもの。後述するIntel AVXが後から発表されたため、SSE5はキャンセルされた。
Intel AVX
MMX/SSEの後継となるSIMD拡張命令セットで、
Sandy Bridge
から搭載された。
VEXプリフィックス
を用いた、全く新しい命令フォーマットを使用することを特徴とする。これに伴い、従来の
XMMレジスター
が128ビット長だったものを、倍の256ビット長の
YMMレジスター
に拡張することができた。理論上、1スロットあたりの演算性能は倍となる。
Intel AVX2
Haswell
から搭載された、拡張命令セット。
機能の有無判別
AVXまでは、機能の有無は、EAXレジスターに1を代入して
CPUID命令
を実行し、ECXレジスターまたはEDXレジスターに得られたフラグの該当ビットが1かどうかで確認できる。
SSE ‐ EDXレジスターのビット25
SSE2
‐ EDXレジスターのビット26
SSE3
‐ ECXレジスターのビット0
SSSE3
‐ ECXレジスターのビット9
SSE 4.1
‐ ECXレジスターのビット19
SSE 4.2
‐ ECXレジスターのビット20
Intel AVX
‐ ECXレジスターのビット28
AVX2以降は、EAXレジスターに7、ECXレジスターに0を代入してCPUID命令を実行し、EBXレジスターに得られたフラグの該当ビットが1かどうかで確認できる。
Intel AVX2
‐ EBXレジスターのビット5
AMD独自の機能の有無は、EAXレジスターに0x80000001を代入してCPUID命令を実行し、ECXレジスターに得られたフラグの該当ビットが1かどうかで確認できる。
SSE4a
‐ ECXレジスターのビット6
XOP
‐ ECXレジスターのビット11
FMA4
‐ ECXレジスターのビット16
新命令
SSEでは計70命令が追加された。ニーモニックのルールは次の通りである。
命令の最後のpsは、4つのパックド単精度浮動小数点演算。
命令の最後のssは、最下位のみの単精度浮動小数点演算。
また、movupsを除く殆どの命令で、メモリーとの128ビットの読み書きには16バイトの
アラインメント
が必要。さもないと
一般保護例外
。
SSEで追加された新命令は、次の通りである。
転送
movaps
movups
movss
movlps
movhps
movlhps
movhlps
movmskps
加算
addps
addss
減算
subps
subss
乗算
mulps
mulss
除算
divps
divss
逆数
の近似値
rcpps
rcpss
平方根
sqrtps
sqrtss
平方根の逆数の近似値
rsqrtps
rsqrtss
最大
maxps
maxss
最小
minps
minss
論理
andps
andnps
orps
xorps
比較
cmpps
cmpss
comiss
ucomiss
シャッフル
shufps
アンパック
unpckhps
unpcklps
変換
cvtpi2ps
cvtsi2ss
cvtps2pi
cvtss2si
MXCSRステート管理
ldmxcsr
stmxcsr
キャッシュなしで転送
movntps
maskmovq
キャッシュ制御、プリフェッチ、メモリーアクセス順序
prefetch
sfence
以下の命令がMMX用に追加された。MMX2とも呼ばれる(MMXと同様に、SSE2からは
XMMレジスター
に対しても可能)。
転送
movntq
平均
pavgb
ワードの転送
pextrw
pinsrw
最大
pmaxub
pmaxsw
最小
pminub
pminsw
各バイトの最上位ビットを汎用レジスターに転送
pmovmskb
乗算
pmulhuw
絶対値
psadbw
シャッフル
pshufw
再検索