SIMT方式のメモリアクセス処理ハードウェア
SIMT方式の場合は、それぞれのレジスタ-演算器ペアが独立にアドレスを計算して、ロードやストアをロード/ストアユニットに要求してくる。そのため、ロード/ストア(Ld/St)ユニットは、このようなばらばらのメモリアクセスパターンを処理できなければならない。
そのため、図2.10のような構造が使われる。まず、各Ld/Stユニットがアクセスするメモリアドレスは対応するアドレスレジスタにValidビットを付けて格納される。
そして、アドレスセレクタはValidのアドレスの中で、例えば、一番左のものを選択してメモリをアクセスする。この図には描かれていないのであるが、例えば、メモリアクセスが64バイト幅とすると、メモリアドレスの最下位6ビットを除いた部分と、各アドレスレジスタの対応する部分を比較し、一致するかどうかを検査する。そして、一致した場合は、メモリから読み出した64バイトの中に目的のデータがあるので、アドレスの下位6ビットでデータを選択してデータクロスバを通してLd/Stユニットにデータを送る。そして、このアクセス要求の処理は終わったので、アドレスレジスタのValidビットをクリアする。
すべてのLd/Stユニットのアクセスが1つの64バイトラインに入っている場合は、すべてアクセスが並列に実行でき、すべてのアドレスレジスタのValidビットが消えて、Ld/St命令の処理が終わる。しかし、別の64バイトラインをアクセスするものがある場合は、そのアドレスレジスタのValidビットはセットされたままで残り、次回以降にアドレスセレクタで選択されてメモリをアクセスすることになる。
NVIDIAは、このような追加のメモリアクセスを「リプレイ」と呼んでいる。最悪の場合は、すべてのLd/Stユニットが異なるアドレスの64バイトラインをアクセスする場合で、その時は、Ld/Stユニットの数だけのメモリアクセスが必要となり、すべてのアクセスが終わるまでは、次の命令へは進めない。
ストアの場合は、アドレスをアドレスレジスタに格納するとともに、Ld/Stユニット内にストアデータレジスタを設けてメモリへの書き込みデータを保持する。そして、64バイトラインアドレスが一致した場合は、データクロスバ経由で、ストアデータレジスタから書き込みデータを取り出して、メモリへの書き込みデータにマージして書き込みを行う。複数の64バイトラインにアクセスがある場合は、リプレイを必要とするのは読み出しの場合と同じである。なお、NVIDIAのGPUでは、異なるLd/Stユニットが同じアドレスに異なるデータを書き込もうとした場合の結果は不定であるということになっている。 また、ここでは図を簡単にするために条件分岐の処理の回路は除いているが、Ld/St命令も条件成立、不成立で実行されたり、されなかったりするので、条件分岐命令に対応できる構造になっている必要がある。