Keplerでは16演算が単位か?

図3-39のように、Kepler GPUでは、1個のワープスケジューラが毎サイクル(最大)2命令を発行するというのはNVIDIAのドキュメントに明記されており、間違いない。しかし、図3-36のSMの図では、8個のDispatcherで毎サイクル最大8命令の発行であるのに対して、縦に16個の実行ユニットが並んだ列が20列描かれている。

図3-36をよく見ると、3列のCore、1列のDP Unit、3列のCore、1列のDP Unit、1列のLD/ST、1列のSFUの並びが2セット描かれている。推測であるが、Warpスケジューラとこれらの実行ユニット列の対応は、3列のCoreと1列のDP Unitは1つのワープスケジューラに対応し、LD/STとSFUはそれぞれ2つのワープスケジューラで共用するという構造になっているのではないかと思われる。

とすると、Dispatcherは1列16個の実行ユニットに命令を発行するが、各列は同じ命令を2サイクル実行することにより、32スレッドを実行すると考えられる。同じ命令を2サイクル実行する場合の実行の様子は図3-40のようになり、SM全体では、各サイクルには8列の16実行ユニットに命令を発行し、次のサイクルには別の8列の16実行ユニットに命令を発行することになる。このようにすると、倍精度浮動小数点のレジスタアクセスに2サイクルを使えるので都合が良い。

図3-40 16実行ユニットで2サイクル同じ命令を実行する場合

ただし、Maxwell GPUでは、Warpスケジューラごとに32個のコアと8個のLD/ST、8個のSFUが対応しており、Coreで実行される命令については1サイクルで32Coreに同時に命令を発行する構造になっているという可能性もある。一方、Core命令と比べて出現頻度の低いLD/STとSFUの命令は、8個ずつ4サイクルに渡って同じ命令を実行し、32スレッドを処理していると考えられる。

図3-40では命令の発行のタイミングだけが書かれているが、実行の部分まで書いたものが図3-41である。この図では、各命令がレジスタファイル(RF)からオペランドを読み出し、演算を行い、レジスタファイルに演算結果を書き込む様子を示している。

図3-41 図3-39で発行された命令の実行の様子

そして、レジスタファイルもパイプライン構造になっており、2サイクルごとに新しいアドレスを受け付けてアクセスを行う。レジスタファイルは、最初の2サイクルのタイムスロットではWarp8-11の命令のオペランドを、次のタイムスロットではWarp2-42の命令のオペランド、その次のタイムスロットではWarp14-95の命令のオペランドのように連続して、次々とアクセスを行う。なお、この説明は、偶数サイクルの命令発行だけを考えたもので、奇数サイクルには別の命令群が発行されるので、レジスタファイルとしては、毎サイクル1回のアクセスを行う必要がある。