NVIDIAのGPUは通常、C言語の拡張であるCUDAでプログラムされる。このCUDAプログラムのデバグやチューニングを行うツールとしてNVIDIAは「Parallel Nsight」というツールを提供している。

2011年7月に行われたGTC Workshop Japanの一環として、このツールの最新版である「Parallel Nsight 2.0」のチュートリアルが行われた。

Parallel Nsight 2.0の説明を行うNVIDIAのVo Duc Khanh氏

ちょっと図が細かくて見づらいが、左上のウインドウにCUDAのソースプログラムを表示しており、条件付きのブレークポイント(マークのついている行)を設定することができる。中央のポップアップウインドウで、最大3次元に配列された並列に実行されるブロックやスレッドの番号を指定すると、右下のウインドウに指定された番号のスレッドのローカル変数が表示されるようになっている。そして、CUDAソースの矢印のついた行が現在の行で、ここからシングルステップで実行したり、次のブレークポイントまで実行したりするなど、通常のデバッガと同じような操作ができるようになっている。

Parallel Nsight 2.0のデバグ画面の例(出所:http://developer.nvidia.com/nvidia-parallel-nsight)

また、Parallel Nsightでは次の図のような動作状況を示す図を表示することができる。横軸は時間で、この図では0.5秒から1.1秒の範囲が表示されており、それぞれの時点での各部の動作状況が把握できるようになっている。この解析は単一のGPUだけでなく、クラスタ構成のGPUに関しても表示できる機能を持っている。

このような解析表示から、リソース使用のアンバランスや空いているリソースを見つけて、それをうまく利用するようにプログラムを書き換えると性能を上げることができる。

Parallel Nsight2.0の動作状況の解析表示(出所:http://developer.nvidia.com/nvidia-parallel-nsight)

のチュートリアルで興味を引かれたのが、アセンブラでのデバグ機能である。

NVIDIAのGPUでは、通常はCの拡張言語であるCUDAでプログラムが行われる。しかし、さらにプログラムをチューニングして性能を出したい場合にはアセンブラに相当するPTXという言語が使われ、東京工業大学(東工大)のTSUBAMEでも本当に性能が重要な部分ではPTXレベルでのチューニングが行われている。

しかし、このPTXは本当のマシン命令に対応するアセンブラではなく、NVIDIAのCUDAライブラリなどではさらにローレベルのマシン命令でのチューニングが行われていると言われていたが、このマシン命令については情報が公開されていない。

今回のParallel Nsight 2.0ではPTXレベルのデバグに加えて、SASSと呼ぶ本当のマシン命令でのデバグ機能が含まれているのが1つの目玉である。

PTXとSASSの両方の表示の例

図が細かくて不鮮明で申し訳ないが、一番上の

sum *= brightness;

というCUDAの行が、

cvta.local.u64 %rd12、 cuda_cudalocalvar3441_12 …

というPTX命令に変換され、それが

MOV R4、 c[0x0][0x4];
MOV R5、 RZ;
MOV R5、 RZ;
MOV R4、 R4;
IADD R0、 R1、 0x150;
MOV R2、 R0;
MOV R3、 RZ;
IADD R2. CC、 R2、 R4;
IADD.X R3、 R3、 R5;

という一連のSASSアセンブラ命令に変換されている。また、その次の

st.param.u64

というPTX命令は

MOV R2、 R2;
MOV R3、 R3;
MOV R5、 R3;
MOV R4、 R2;

というSASS命令の列になっている。これらの例では1行のPTX命令が8行とか4行とかのSASS命令になっているが、その次のld命令は2行、さらにその次のst命令やcall命令では1行のPTX命令が1行のSASS命令に対応している。

そして、Parallel Nsight 2.0ではPTXレベルでもSASSレベルでもそれぞれの命令の1行の単位でステップ実行ができるようになっている。

マシン命令と1対1に対応しているSASS命令を公開してしまうと、将来、SASS命令に変更がでるようなハードウェアの変更がやり難くなる。このため、GPUハードウェアの将来の変更が制約されるのを嫌ってNVIDIAはSASS命令を公開してこなかったと思われる。今回のParallel Nsight 2.0でのSASS命令のサポートは、GPUのマイクロアーキテクチャがかなり固まってきており、将来、新機能とそれをサポートする新命令の追加は当然あり得るが、現在のSASS命令を変える必要は、まず、無いと判断したのではないかと思われる。

先のコードを見ても、MOV R2、 R2;のような無意味と思われるコードやMOV R5、 RZ;が2つ連続しているコードが含まれているし、元のPTX命令の範囲を超えてSASS命令の順序を入れ替えた方が性能があがるというケースも十分考えられる。SASS命令を見せることでPTXからSASSへの変換の品質改善やより高度なチューニングが可能となり、それはNVIDIAのGPUにとってはハード変更の制約よりプラスであるということを重視したのであろう。

ただし、現時点ではNVIDIAはFermi GPUのSASS命令仕様を公開していない。チュートリアルを担当したVo Duc Khanh氏は、SASSの仕様公開については現在、社内で検討中と述べていた。しかし、SASSの命令仕様が公開されなければ、Parallel Nsight 2.0のSASS表示はあまり意味が無いので、近く公開される可能性が高いと思われる。