# SIMD ベクトル処理
単一命令で**複数のデータ要素を同時に処理**するデータレベル並列性(DLP)の手法。ILP(命令レベル)・TLP(スレッドレベル)に並ぶ第三の並列性の柱。
## 基本概念
画像処理では、4 ピクセルの R/G/B/A(各 8-bit)をまとめて 1 命令で加算できると、4 回の逐次処理より大幅に速くなる。これが SIMD(Single Instruction, Multiple Data)の本質。
ハードウェア実装は比較的安価:
- 既存の整数・浮動小数点ユニットを転用・拡張できる。
- レジスタの利用方法を変えるだけで済む場合も多い。
- **飽和算術**(8-bit なら 255 でクランプ)などの拡張も自然に追加できる。
## アーキテクチャ別 SIMD 拡張の変遷
| アーキテクチャ | 拡張命令セット | レジスタ幅 | 備考 |
|---|---|---|---|
| x86 | MMX | 64-bit | FP レジスタ転用 |
| x86 | 3DNow!(AMD) | 64-bit | MMX + FP |
| x86 | SSE | 128-bit | 専用 XMM レジスタ 8 本 |
| x86 (64-bit) | SSE2〜4 | 128-bit | XMM 16 本に拡張 |
| x86 | AVX / AVX2 | 256-bit | YMM レジスタ |
| x86 | AVX-512 / AVX10 | 512-bit | ZMM レジスタ |
| POWER/PowerPC | AltiVec | 128-bit | 専用 128-bit レジスタ 32 本 |
| ARM | NEON | 64/128-bit | レジスタペアで 128-bit |
| ARM | SVE / SVE2 | 128〜2048-bit | 実装依存の可変幅 |
| SPARC | VIS | 64-bit | — |
> [!key-insight] ARM SVE のスケーラブル設計
> x86 の MMX→SSE→AVX→AVX-512 の段階的拡張はバイナリ互換性の複雑さを生んだ。ARM SVE は「レジスタ幅を実装に委ねる」設計で、128-bit のモバイル実装から 2048-bit のサーバー実装まで**同一バイナリで動作**する。
## 適用領域と効果
**大きな効果が期待できる領域**:
- 画像・動画処理(ピクセルの並列操作)
- 音声処理
- 3D グラフィクスレンダリング(頂点変換など)
- 科学計算(行列演算、FMA: 積和演算)
**効果が限定的な領域**:
- コンパイラ・DB システム(ポインタチェーシング中心)
- 一般的な制御フロー重視のコード
## 自動ベクトル化の難しさ
コンパイラが通常のソースコードから自動的に SIMD 化することは難しい。**逐次的に書かれたコードは並列性の証明が困難**なため。
現実的なアプローチ:
- OS のライブラリ関数(画像処理・音声デコード・暗号)を手動 SIMD 化 → アプリは間接的に恩恵を受ける。
- 科学計算の単純配列ループは自動ベクトル化が比較的容易。
- ゲーム・マルチメディアアプリは SIMD イントリンシクス(C 言語レベルの SIMD API)を手動で使う。
## 横断的知見
- 今後の取り込みで、複数ソース間の関係を追記する。
## 未解決の問い
- この概念をどのソース群で継続的に検証するか。
## 関連
- ILP・TLP との組み合わせ → [[スーパースカラー実行]]、[[同時マルチスレッディング]]