SIMDとSIMTの違い:実行モデル・プログラミング・分岐・メモリアクセスを比較
SIMDもSIMTも、1つの命令で多くのデータに同じ演算をする点は同じですが、プログラムからの見え方が違います。SIMDはCPUのベクトル命令で、プログラマやコンパイラが幅の決まったベクトルレジスタにデータを並べ、明示的に命令を使います。SIMTはGPUの方式で、1本のスレッドの処理を普通に書くと、ハードウェアが32本などのスレッドをワープに束ねて同じ命令で動かします。スレッドごとに分岐も書けますが、ワープの中で分岐が分かれると両方の経路を順に実行するので、効率が下がります。
| 項目 | SIMD | SIMT |
|---|---|---|
| 実行モデル | 1つの命令で、ベクトルレジスタに並べた複数の要素を同時に処理する | 1つの命令を、ワープに束ねた多数のスレッドが同時に実行する。各スレッドは自分のレジスタを持つ |
| プログラムの見え方 | ベクトルの幅を意識して書く。組み込み関数、アセンブリ、コンパイラの自動ベクトル化を使う | 1本のスレッドの処理をスカラのコードとして書く。束ねるのはハードウェア |
| 並列の幅 | レジスタの幅で決まる。例: 512ビットなら32ビットの数16個 | ワープの幅(32本など)。チップ全体では数万本のスレッドを同時に保持する |
| 分岐の扱い | 要素ごとの分岐は書けない。比較結果のマスクで両方を計算して選ぶ | スレッドごとに書ける。ワープ内で分かれると両方の経路を順に実行し、該当しないスレッドを休ませる(ダイバージェンス) |
| 有効な要素の管理 | プログラマやコンパイラが、マスク付き命令やブレンド命令で明示する | ハードウェアが、有効なスレッドを自動で管理する |
| メモリアクセス | 連続した番地をまとめて読むのが得意。ばらばらの番地はギャザー・スキャッタ命令で扱うが遅い | 各スレッドが自由に番地を指定できる。隣り合うスレッドが隣り合う番地を読むとまとめられる(コアレッシング) |
| メモリの遅延の隠し方 | 大きなキャッシュ、アウトオブオーダー実行、プリフェッチ | 多数のワープを切り替え、待っているワープの間に別のワープを動かす |
| フリンの分類での位置づけ | SIMDそのもの | SIMDの一種を、スレッドの形で見せる方式 |
| 代表的な使われ方 | CPUのベクトル命令。画像・音声の処理、暗号、行列演算のループなど | GPUのワープ。グラフィックス、AIの学習・推論、科学技術計算などの大規模な並列計算 |
数値は代表的な目安で、世代や製品によって異なります。