# 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 との組み合わせ → [[スーパースカラー実行]]、[[同時マルチスレッディング]]