TL;DR
1 つの命令を複数のデータに適用するアーキテクチャ。
仕組み
SIMD は 1966 年に Michael J. Flynn が提唱した計算機アーキテクチャの分類(フリンの分類)の 1 つである。Wikipedia の例では、4 次元ベクトルの加算を従来のプロセッサで行うと、成分ごとに 4 回の加算命令を順に実行する。128 ビットのレジスタに 32 ビットのデータを 4 つ詰めて扱える SIMD のプロセッサなら、1 回の命令で 4 つの成分をまとめて計算でき、理論上の消費サイクル数は 1/4 になる。
同じ演算を大量のデータに適用する処理で効果が大きく、数値計算、画像処理、信号処理、マルチメディア処理に使われる。
例
x86 の MMX、SSE、AVX、ARM の NEON、SVE、PowerPC の AltiVec など、CPU の拡張命令として実装されている。GPU も SIMD を取り入れた設計になっている。
注意点
命令セットはプロセッサごとに異なるので、手作業でベクトル化したコードは移植性と保守性が下がる。コンパイラの自動ベクトル化なら移植性を保ちやすいが、どこまで速くなるかはコンパイラの解析能力に左右される。
関連
- 命令セットアーキテクチャ
- WebAssembly: 固定長の SIMD が仕様に追加されている