SIMTアーキテクチャ

例えば4個の演算器を持つSIMDの場合は、それぞれの演算器が1つの頂点のX、Y、Z、W座標を担当するとか、頂点V0、V1、V2、V3を担当し、それぞれの頂点のX、Y、Z、W座標を順に処理するとかを決めて、それに対応したプログラムを書くことになる。

コンピュータグラフィックスでは、座標はX、Y、Z、W、ピクセルはR、G、B、αのように4要素のベクトルで表すのが一般的であり、これを4つの演算器で並列に処理して、1点の処理が終わったら、次の点を処理するというのは考えやすく、PS3で開発されたCELLプロセサでは、このような処理を行っていた。

しかし、さらに性能を上げるために演算器の数が増えてくると、SIMDの並列数を意識してプログラムを作る必要があり、プログラムがスケーラブルにならないという問題が明らかになってきた。このため、NVIDIAのGeForce 8800 GPUではTeslaアーキテクチャと呼ぶ新しい構造を採用した。

Teslaアーキテクチャでは、SIMDアーキテクチャでは面倒であった条件分岐命令の処理とメモリアクセスの問題を、プログラマが意識することなくハードウェアが処理してくれる。条件分岐命令の処理は、マスクを使って、演算結果のレジスタへの書き戻しを制御するもので、基本的にはSIMDの場合と同じ処理を行う。そして、メモリアクセスに関しては、各レジスタ-演算器ペアが計算したメモリアドレスが、それが連続であろうと、バラバラなアドレスであろうと、処理できるというロードストアユニットを装備している。

結果として、各レジスタ-演算器ペアが1つの頂点やピクセルの処理を行うスレッドの実行を完結して行うことができる構造となっている。このため、NVIDIAは、この構造を「SIMT(Single Instruction stream Multiple Thread)方式」と呼んでいる。

SIMT方式の場合、スカラのCPUで1点ずつ順番に処理を行っていく場合とまったく同じ処理であり、普通のCPUの処理アルゴリズムがそのまま使え、プログラムが作りやすいという大きなメリットがある。また、SIMD方式では、演算器の数を意識したプログラムの作りが必要になる部分があるが、SIMT方式では、実行すべき全スレッドをレジスタ-演算器ペアの数だけ並列に実行していくという動作であり、小さいハードウェアの場合は実行に時間がかかり、大きいハードウェアの場合は短時間で実行されるという違いだけで、プログラムとしてはハードウェアの並列度を意識する必要がない。これらの利点から、最近ではSIMT方式のGPUが増えてきている。

なお、日本ではSIMDをシムドと発音する人が多いが、英語圏ではシムディーと発音するのが普通で、その流れで、SIMTはシムティーと発音される。

SIMT方式の条件分岐処理ハードウェア

SIMTの条件分岐を処理するハードウェアは図2.9のようになっている。それぞれのレジスタ-演算器ペアに条件の成立、不成立を記憶するレジスタを追加し、そのレジスタの値によって、演算結果のレジスタへの書き込み(Write Enable)を制御する。このようにすれば、条件が成立したスレッドでは演算結果がレジスタに書き込まれてその命令が実行されたことになり、条件が不成立のスレッドでは演算結果はレジスタに書かれずに捨ててしまうので、その命令を実行しなかったことになる。

図2.9 SIMTの条件分岐処理を行うハードウェア

なお、原理的にはこれで良いのであるが、演算結果を捨ててしまう演算を実行するのは無駄なエネルギーを消費してしまうので、実際には、レジスタからのオペランドの読み出しや演算も止めて節電するという作りが一般的なようである。

そして、if (条件) then{A}のAの命令列の終わりに、命令ユニットから、無条件に実行するという出力を出す条件レジスタを選択するという指示を出すようにする。なお、ネストされた条件に対応するため、条件レジスタを複数個もつのが一般的であり、複数の条件レジスタのビットの論理演算を行いレジスタへの書き込み信号(WE)を生成する機能を持っているものもある。例えば、NOTを出すことができれば、if (条件) then{A}else {B}の場合は、 Aの命令列は条件レジスタのビットそのままをWE信号として、Bの命令列は条件レジスタのビットの否定をWE信号としてやれば良い。