SIMT(Single Instruction Multiple Threads)は、並列コンピューティングで使用される実行モデルで、中央の「制御ユニット」が複数の「処理ユニット」に命令をブロードキャストし、各処理ユニットがオプションでその命令を同時に同期かつ完全に独立した並列実行します。各処理ユニットは独自のデータレジスタとアドレスレジスタ、独自のメモリを持ちますが、アレイ内のどの処理ユニットにもプログラムカウンタはありません。1972年のフリンの分類では、この構成はアレイプロセッサと呼ばれるSIMDのバリエーションです。

SIMT実行モデルはいくつかのGPUに実装されており、グラフィックス処理ユニット(GPGPU)上での汎用コンピューティングに関連しています。たとえば、一部のスーパーコンピュータはCPUとGPUを組み合わせています。ILLIAC IVでは、そのCPUはBurroughs B6500でした。
SIMT実行モデルは、プログラマーに対して、根本的には依然として述語付きSIMDの概念を提示する方法にすぎません。プログラムは、述語付きSIMDを念頭に置いて設計する必要があります。命令発行(同期ブロードキャストとして)が単一の制御ユニットによって処理されるため、SIMTは、制御ユニットのみがプログラムカウンタを持っているため、スレッド(PE、レーン)が分岐によって分岐することを設計上許可できません。したがって、可能な限り分岐は避ける必要があります。[ 2 ] [ 3 ]
SIMTを理解する最も簡単な方法は、各コアが独自のレジスタファイル、独自のALU (SIMDとスカラーの両方)、および独自のデータキャッシュを持つマルチコア( MIMD )システムを想像することです。ただし、複数の独立した命令キャッシュとデコーダ、および複数の独立したプログラムカウンタレジスタを持つ標準的なマルチコアシステムとは異なり、SIMTでは、単一の命令キャッシュと単一の命令デコーダを備えた単一のユニットから、すべてのSIMTコアに命令が同期的にブロードキャストされ、単一のプログラムカウンタを使用して命令を読み取ります。
SIMT レーンとSIMD レーンの主な違いは、SIMT アレイの各処理ユニットが独自のローカル メモリを持ち、完全に異なるスタック ポインタを持つことができる (したがって、完全に異なるデータセットに対して計算を実行する) のに対し、SIMD レーンの ALU はメモリ自体については何も知らず、レジスタ ファイルも持たないという点です。これはILLIAC IVで示されています。各 SIMT コアは処理要素 (PE) と呼ばれ、各 PE は独自のメモリ (PEM) を持っていました。各 PE には、PEM へのアドレスである「インデックス レジスタ」がありました。[ 4 ] [ 1 ] ILLIAC IV では、Burroughs B6500 が主に I/O を処理しましたが、制御ユニット (CU) にも命令を送信し、CU が PE へのブロードキャストを処理しました。さらに、B6500 は I/O プロセッサとしての役割で、すべてのPEM にアクセスできました。
さらに、各PEはアクティブまたは非アクティブにすることができます。特定のPEが非アクティブの場合、制御ユニットからブロードキャストされた命令は実行されず、アクティブになるまで待機状態になります。各PEは述語を持つと言えます。
また、SIMTとSPMD (シングルプログラムマルチデータ)の違いにも注意が必要です。SPMDは、標準的なマルチコアシステムと同様に複数のプログラムカウンタを備えていますが、SIMTは(1つの)制御ユニット内に1つしかプログラムカウンタを備えていません。
フリンの分類法では、フリンの原著論文では、SIMTプロセッサの歴史的な例としてSOLOMONとILLIAC IVの2つが「アレイプロセッサ」と呼ばれています。[ 1 ] SIMTはNVIDIAによってG80チップを搭載したTesla GPUマイクロアーキテクチャで 導入されました。 [ 5 ] [ 6 ] 現在AMDとなっているATI Technologiesは、 2007年5月14日に競合製品であるTeraScale 1ベースの「R600」 GPUチップを少し遅れてリリースしました。
SIMTプロセッサは、単一の中央ユニットの制御下で、複数の「スレッド」(または「ワークアイテム」または「SIMDレーン操作のシーケンス」)を同期して実行します。このモデルはSIMDレーンと共通の特徴を持っています。[ 7 ]
ILLIAC IVは、現代の述語マスキングの先駆けとなる「分岐」メカニズムを詳細に文書化した。
広く普及しているすべてのRAMタイプ(DDR SDRAM、GDDR SDRAM、XDR DRAMなど)のアクセス時間は依然として比較的高く、メモリウォールと呼ばれる現象を引き起こしているため、エンジニアはメモリアクセスごとに必然的に発生するレイテンシを隠すというアイデアを思いつきました。ILLIAC IVの設計で示されているように、個々のPEは標準的なCPUよりも低いクロックレートで動作しますが、クロックレートの不足を補うために、はるかに多くのPEを並列で実行します。その結果、各PEの低速がRAMの速度によりよく適合します。この戦略は、GPUワークロードが本質的に並列であるため機能し、タイルレンダリングはその一例です。
SIMTは、命令フェッチのオーバーヘッド[ 8 ] 、つまりメモリアクセスに伴うレイテンシを制限することを目的としており、最新のGPU( NVIDIAやAMDなど)では、メモリアクセス操作のレイテンシがかなり大きいにもかかわらず高性能な実行を可能にするために、「レイテンシ隠蔽」と組み合わせて使用されています。SIMDと同様に、もう1つの大きな利点は、制御ロジックを多数のデータレーンで共有することで、計算密度が向上することです。1つの制御ロジックブロックでN個のデータレーンを管理でき、制御ロジックをN回複製する必要がありません。
SIMT実行の欠点は、プログラムカウンタが1つしかないため、「述語マスキング」がPEごとの実行を制御する唯一の戦略となり、複雑なアルゴリズムでは利用効率が低下することである。
NVIDIA GPU には、「ワープ」と呼ばれるスレッド グループの概念があり、これは同期して実行される 32 個のハードウェア スレッドで構成されています。AMD GPU では、これに相当するものが「ウェーブフロント」ですが、こちらは 64 個のハードウェア スレッドで構成されています。OpenCL では、ワープとウェーブフロントの抽象用語を「サブ グループ」と呼びます。CUDA には、スレッド グループ内での並列データ交換を高速化するワープ シャッフル命令もあり、[ 10 ] OpenCL では、拡張機能 cl_khr_subgroups により同様の機能のサポートが可能です。[ 11 ]