Instruction throughputの意味

まだまだ続くCUDAねた。

CUDAにはCUDA Visual Profilerという便利なものがありまして、メモリの使用帯域とか各カーネルごとの実行時間をお手軽に測定することができます。
で、こいつで測定できる項目の一つにinstruction throughputというのがあります。
直感的にはいわゆる実行効率なのかなーと思うわけですが,1.0以上あるとか*1、ただの比率だとか*2いろいろ書かれていてよくわからんわけです。
というわけで簡単に調べたメモ。

そして身も蓋もない話で申し訳ないのですが、だいたいのことはマニュアル(同梱のcudaprof.html)に書いてありました。
それによりますと

instruction throughput: Instruction throughput ratio.
(略) calculated using the "instructions" profiler counter.
(略) calculated based on the GPU clock speed.

というように、instructionsカウンタの値から計算されるわけですね。
ただしinstructionsカウンタの解釈が問題で、
「Profiler counters for a single multiprocessor」の項目にあるように

These counters are incremented by one per each warp.

となっています。つまりthread単位ではなくwarp単位で積算されているため、全体の実行命令数を求めるにはこの値を32倍する必要があります。
そしてもう一つ、

the profiler can only target one of the multiprocessors in the GPU

と書かれているように、このプロファイラはどれか一つのSMを測定対象としています。
そのため、この実行命令数は測定対象のSMに関する統計になっているとみられます。

さて、全体の実行命令数がわかれば後は簡単です。
Instruction throughputはratioとなっていますから、最大実行可能命令数 = GPU(SM)のクロック * 実行時間(GPU Timeカウンタ) * 8 (SP)として最大実行可能命令数を求め、実行効率 = 全体の実行命令数 / 最大実行可能命令数 とすればInstruction throughputの値が再現できます。

例えばGPU Time = 19684.3 [usec]、instructions = 4813980、クロック = 1.35 GHzでは

全体の実行命令数 = 4813980*32 = 154047360
最大実行可能命令数 = 1.35*10^9*19684.3*10^-6*8 = 212590440

となるので、

Instruction throughput = 154047360 / 212590440 = 0.724620355

となります。これは測定値 Instruction throughput = 0.724618とほぼ一致します。

・・・こんなんでいいのかな?