Teslaの動作の仕組み

Kirk氏は続いてTeslaがどのように動作するのかを解説した。

Teslaはハードウェアの本質的には全くGeForce 8800 GTXと同じで、ブロックダイアグラムの構成はGeForce 8800 GTXと同じであると説明し、このハードウェアの活用の仕方を変える仕組みを実装することで「大規模並列処理コンピューティング・プラットフォーム」を実現する。

Teslaのブロックダイアグラム。実際のところ、GeForce 8800 GTXと同じ

GeForce 8800 GTXのブロックダイアグラム(参考)

GeForce 8800 GTXでは、8基のスカラー・ストリーミング・プロセッサをひとかたまりとして、これがペアで1ブロックを形成し、さらにこれが8セットある構成になっていた。

ハードウェア設計が同じTeslaでもこの構成は変わらない。

ただ、便宜上、名称は微妙に変わっている。

最小単位の演算基であるスカラプロセッサはStreaming Processor(SP)で同じだが、これが8基集まった最小ブロックをStreaming Multi-Processor(SM)と呼んでいる。

図はSMを図解したものだ。

Streaming Multi-Processor(SM)のブロックダイアグラム

SPはIEEE754準拠の32ビット整数/32ビット浮動小数点のスカラプロセッサだ。この図にはない要素として三角関数や指数/対数関数、平方根などの計算を担当する超越関数ユニット(SFU)が2基あり、これは4基のSP単位での共有ユニットとして実装されている。

プログラミングモデル(Instruction Set Architecture)的にはCPU的なスカラ命令実行スタイルが実現される。つまり、本質的なプログラム構造としてはベクタや並列を意識しなくてよいと言うことだ。

SM1基あたりでは最大768スレッドの実行を担当する。GeForce 8800 GTX(G80)では16基のSMがあるのでG80全体では12288スレッド(768×16)が実行されることになる。なお、ここでいうスレッドとはプログラムスレッドではなく、処理する対象データ…すなわち「データスレッド」を指している点に注したい。

768スレッドは32スレッド単位に分割されて管理され、これをTeslaではWarp(ワープ)と呼んでいる。

SM1基あたりでは32スレッド単位に実行されることになるが、スレッド切り替えの遅延時間はゼロだという。各ワープはSM内のSPをハードウェア的にスケジューリングして自動的に実行される。将来のGPUでSM内のSPの個数が増えた場合には、さらに効率よく実行できることになる。

Shared Memoryは、SM内で共有されるローカルメモリ、もっといえばSM内SPで共有され、SP間(正確にはスレッド間)のデータ同期に活用されるメモリ空間と言うことになる。

実際の実行は1ワープ(32スレッド)単位に実行され、前述したように1スレッドはデータスレッドであり、プログラムが分岐を含んでいて、ある特定のデータに対して分岐実行が発生した場合には並列性が崩れ少々厄介なことになる。

そのワープでは、分岐後の実行命令と、分岐しなかったときの命令実行の両方のパスを実行する必要が出てきてしまい、その2つのパスでSPの活用の仕方が異なったり、そもそも実行する命令数が異なったりすると、実行効率は低下してしまうのだ。

なお、各SMは管理下のワープの中から、どれを実行すべきかということについては自動的に選択している。

ちなみに図はワープが実行される様子を図式化したものだ。

処理はワープ単位に実行される。分岐処理が起きた場合かなり面倒

プログラムに含まれる各命令を各ワープ(32個のデータスレッド)に対して実行していく様を図解している。なお、この図では便宜上、1ワープは16データスレッド(矢印の数)を表している。1ワープ単位で見ると1命令を複数のデータに対して適用したことになるので、ミクロ的にはSIMD(Single Instruction Multiple data)処理がなされているということになる。

1命令が1ワープ単位に実行完了すると次の命令とその実行対象ワープの切り替えが行わるが、どのワープの実行をすべきかの選択を行うのがMT IU(Multithreaded Instruction Unit)で、そしてこのワープ切り換え遅延がゼロだというわけだ。