Single Instruction, Multiple Threads
単一命令・複数スレッド(英: single instruction, multiple threads、SIMT)は、並列計算で用いられる実行モデルであり、単一命令・複数データ(SIMD)とマルチスレッドを組み合わせたものである。すべての「スレッド」においてすべての命令がロックステップ方式によって同期して実行される点で、単一プログラム・複数データ(SPMD)とは異なる。SIMT実行モデルは、多くのGPUに実装されており、GPU上での汎用計算(GPGPU)において特に重要である。例えば、いくつかのスーパーコンピュータではCPUとGPUを組み合わせて使用している。
プロセッサの数をpとすると、実際にはp以上の多くのタスクを実行しているように見える。これは各プロセッサが複数の「スレッド」(「ワークアイテム」や「SIMDレーン操作のシーケンス」)を持つことによって達成されているが、このスレッド群は同期してタスクを実行し、SIMDレーンに類似している。
SIMTを最も簡単に理解する方法は、各コアが個別のレジスタファイル、個別のALU(SIMDおよびスカラー両方)、および個別のデータキャッシュを持つような、マルチコアシステムを想像することである。ただし、標準的なマルチコアシステムが複数の独立した命令キャッシュとデコーダ、そして複数の独立したプログラムカウンタレジスタを持つのと違って、単一の命令キャッシュと単一の命令デコーダを持ち、単一のプログラムカウンタを用いて命令を読み取る単一の演算装置から、命令が全SIMTコアに対して同期的にブロードキャストされる。
SIMTとSIMDレーンの主要な違いは、各SIMTコアが完全に異なるスタックポインタを持ち得る(それによって全く異なるデータセット上で計算を行うことができる)点であり、一方SIMDレーンは単にメモリに関する知識を持たないALUの一部である。
歴史
SIMTはNVIDIAのG80チップに採用されたTeslaマイクロアーキテクチャにおいて導入された。2006年11月8日にG80を搭載したGeForce 8800シリーズおよびCUDAが発表された。ATI Technologies(現在のAMD)は競合製品として、やや遅れて2007年5月14日にTeraScale 1ベースの「R600」GPUチップをリリースした。
解説
すべての一般的なRAM(例えば、DDR SDRAM、GDDR SDRAM、XDR DRAMなど)のアクセス時間が依然として比較的大きいため、技術者たちはメモリアクセスのたびに必ず発生してしまうレイテンシを隠蔽するというアイデアを考案した。厳密に言えば、レイテンシ隠蔽はモダンなGPUによって実装されたゼロオーバーヘッドスケジューリングの機能である。これはSIMT自体の特性とみなすことができるかもしれないし、そうでないかもしれない。
SIMTは命令フェッチのオーバーヘッド、すなわちメモリアクセスに伴うレイテンシを制限することを目的としており、モダンなGPU(NVIDIAやAMDのものなど)では、メモリアクセス操作におけるかなりのレイテンシがあるにもかかわらず高性能な実行を可能にするために、レイテンシ隠蔽と組み合わせて使用されている。このメモリアクセス操作は、プロセッサが計算タスクで過負荷状態になっていて、メモリの読み書き完了を待たなければならな��状況で素早くタスクを切り替えることができるポイントである。この戦略はCPUのマルチスレッディング(マルチコアと混同しないように)に類似している。SIMDと同様に、もう一つの大きな利点は、多くのデータレーンによる制御ロジックの共有であり、これにより計算密度が増加する。一つの制御ロジックのブロックがN個のデータレーンを管理できるため、制御ロジックをN回複製する必要がない。
SIMT実行の欠点は、スレッド固有の制御フローが「マスキング」を用いて行われることであり、プロセッサのスレッドが異なる制御フローパスをたどるときに効率が悪くなることである。例えば、プロセッサの様々なスレッドが異なるパスを実行するようなIF-ELSEブロックを処理するためには、実際にはすべてのスレッドが両方のパスを処理しなければならないが(プロセッサのすべてのスレッドは常に同期して実行されるため)、様々なスレッドを必要に応じて無効化および有効化するためにマスキングが使用される。制御フローがプロセッサのスレッドにとって一貫している場合、すなわちすべてが同じ実行パスをたどる場合、マスキングは避けられる。このマスキング戦略がSIMTを普通のSIMDと区別するものであり、プロセッサ内のスレッド間の同期が低コストになるという利点がある。
NVIDIA GPUは32個のハードウェアスレッドを同期して並列実行する「Warp」と呼ばれるスレッドグループの概念を持っている。AMD GPUでこれに相当するものは「Wavefront」と呼ばれており、64個のハードウェアスレッドからなる。OpenCLでは「サブグループ」と呼ばれ、CUDAのWarpシャッフル命令(スレッドグループ内での高速な並列データ交換を可能にする命令)に相当する機能サポートは拡張cl_khr_subgroupsとして標準化されている。