NVIDIAのハイエンドGPU「Tesla K20/K40」は消費電力のセンサを持っており、NVIDIAのManagementライブラリを使うとこのセンサの値を読むことができる。ということで、GPUの消費電力を測ってみたのであるが、どうも結果がおかしいということで、テキサス州立大のMartin Burtscher准教授は、正確な消費電力を求めるには、どうすればよいかを研究したという結果をGTC 2014で発表した。

NVIDIAのパワーセンサの問題

K20c、K20m、K20X、K40mをそれぞれ2台ずつ用意し、電力を測定したのであるが、同じカーネルを2度実行して測定すると、1回目は114J、2回目は147Jと29%も値が違ってしまった。また、同じカーネルを2倍の時間走らせると、消費エネルギーは2倍のはずだが、それよりも8%多くなってしまったという。

1回目と2回目で測定値が違うなどいろいろとおかしな結果になる

また、センサをサンプリングしている間隔も0.266msから130msと500倍も変わっていることが分かったという。 最初の5秒間だけカーネルを実行させ、その後はアイドルという状態で、消費電力の測定値を時系列でプロットしてみると、次の図のようになった。

最初の5秒間だけカーネルを実行した場合の測定結果

カーネルが走ると消費電力は瞬間的に増加すると考えられるが、測定結果ではゆっくりと電力が増加している。また、カーネルの実行が終わると、瞬間的に電力が減るはずであるが、減少もゆっくりである。しかし、最後の区間ではステップ状に電力が減っており、ゆっくりしか電力が変わらないというわけでもない。

短いカーネルを、少し時間をあけて実行すると、次の図のような測定結果となった。

ゆっくりとした増加のペースは前の長時間のカーネルと同じであったが、2回目のカーネルの実行開始時の電力は、高い値から始まっており、2回目の終了時の減少のペースは長時間のカーネルの場合とは異なっていたという。

このようなおかしな結果は、たまたま測定したチップが不良だったわけではなく、測定した2チップともに同じ傾向を示したという。

なお、最後のステップ状に電力が減っている部分は、GPUがアイドルになったため、ドライバが不要と判断した部分を、1秒ごとに順にパワーダウンしているためと考えられるという。

センサの値を読み取る周期であるが、CPUがビジーになりドライバが動く時間が少なくなると間隔が長くなり、また、非常に短い間隔での測定は同じ値が連続して読み取られており、センサを実際に読むのではなく、キャッシュされた値を繰り返し読んでいる可能性が高いという。

センサから読み取った結果の補正

そこで、15ms間隔でセンサを読むようにし、高分解能のタイムスタンプを使って正確な測定時刻を使うようにすると、電力測定値は、次の図の赤線のようになり、当初の可変インターバルの測定より長く高電力の状態が続き、消費エネルギーに13%の違いが出た。

当初の測定と、測定間隔を一定にした測定との比較。消費エネルギーが13%違う

この電力測定値のカーブはRC回路のような応答を示しており、センサの測定値には時間遅れがあると思われる。これを補正すると、

真の電力=センサ電力+0.833×d(センサ電力)/dt

となる。なお、0.833秒という係数はすべてのK20 GPUで同じであったという。

センサの測定値はRC回路のような特性が見られ、真の電力を求めるにはこれを補正する

破線で示した測定値にこの補正を施すと、次の図の実線のようになり、若干のノイズを無視すると、消費電力は、カーネルの走行中は160W一定で、アイドルになると50W程度に減少するというグラフが得られる。

破線の測定値に補正を施すと、電力値は実線のようになる

同じ補正を2番目の短時間のカーネルを2回実行した場合の測定に適用したのが次の図で、カーネルの実行中は160Wで、途中のアイドル期間は50Wに下がるという予想された特性が得られており、この補正の正しさを裏付けている。

短時間のカーネルを2回実行した場合の測定値に補正を施した結果

この補正はK20c、K20m GPUでも同様にうまく行く。

しかし、K20X GPUの測定値は次の図のようになっており、ノイズは多いものの、センサ応答の遅れの補正がドライバ内部で行われているように見える。

K20X GPUのドライバでは補正が内部で行われているように見える

ただし、消費出力はこの論文の値とは若干異なり、カーネル実行時には164W、アイドル時には44W程度となっている。また、カーネル実行からアイドルに切り替わったときに600msの測定間隔があいている理由は不明で、カーネル終了に伴う作業でCPUがビジーになりセンサが読めなかったという可能性がある。

興味深いのは、次に示すK40mの測定結果で、K20Xで改善したセンサのタイムコンスタントの補正が無くなって、K20m、K20cのドライバのレベルに戻っている。

最新のK40mでは、K20Xで入った補正が無くなり、K20mレベルにレベルダウンしている

また、K40mの消費電力はカーネル実行時、アイドル時ともに、K20mと比較すると10W程度増えているが、これが設計に起因するものか、単なる個体差かは分からない。 ここまでは単純なカーネルを使った測定であるが、Barnes Hut法のn-bodyの重力相互作用を計算するプログラムで評価を行った。その結果の実測値と補正を行った結果が次の図である。

Barnes Hut法のn-bodyコードの消費電力。破線が測定値で、実線が補正値

最初の2区間とその次の1区間はイレギュラーなカーネルの実行で、GPUコアの使用率が低いので、消費電力も少なくなっている。そして、その後はGPUをヘビーに使うカーネルの実行に入り消費電力は130W弱となる。最後の部分では早く実行を終わったコアが出てきて消費電力が減るという実線の結果が得られており、予想通りの結果になっている。

また、実測値ではまったく分からないが、補正した結果は終了の直前に消費電力が急増している。これは非常に短い時間であるが、レギュラーでGPUコアの使用率の高いカーネルの実行があり、これを反映していると考えられる。このように、補正を行うことにより、補正を行わない実測データからはわからない情報を得ることができるという。

この発表は、NVIDIAのマネジメントライブラリの電力測定の欠陥を暴いており、このような発表が許されることが、GTCの魅力である。学術的な発表がないこともあるが、IDFなどでは、このような主催者の製品の欠陥を暴く発表は考えにくい。担当者は叱責されたかもしれないが、この発表でBurtscher先生の研究結果が取り入れられて電力測定の精度が改善されれば、それはNVIDIA GPU製品の競争力を上げることにつながり、NVIDIAにとってもプラスに働く。