NVIDIAの TESLA K80で手始めにサンプルプログラムを動かすところまでの記録。ハマった原因は二つ。
1. TESLA K80は、Kepler という今では4世代前の古いアーキテクチャ
2. CPUの内蔵グラフィクスを利用
ハードウェアは CPUが 11700K (第11世代 Core i7)で、マザーボードは ASUS TUF GAMING Z590 PLUS、グラボなしの構成。
ソフトウェアは、Windows 10 . ドライバーは、NVIDIAのサイトから入手. (462.31-data-center-tesla-desktop-win10-64bit-international.exe). 開発環境は、Microsoft Visual Studio Community 2019 にCUDA Toolkit 11.3.1 (cuda_11.3.1_465.89_win10.exe) をインストール。
#ちなみに、VS2019には、intel oneAPI ツールキットも先にインストールしていたが問題ないようだ。
Step 0. インストール
インストールに特別なことはなし。GPUカードを刺して立ち上げ、ドライバーをインストール。Visua Studioはインストール済みのところへ、CUDA Toolkit をインストール。
Step 1. hello.cu の実行
まず、これが正しく動作しなくて悩む。
こちら (https://www.kkaneko.jp/tools/win/cuda10.html#S2) に従って hello.cuを作成しコンパイル。
で、実行結果した結果はこうなるはずが...
C:\test>a.exe
Max error: 0.000000
下記のようになってしまった。
C:\test>a.exe
Max error: 2.000000
いろいろデバッグしてみた結果、GPU側のコードが動いていないようなので、下記のようにソースを書き換えてみると... エラーコード 209が起きていると判明。
------------
// Perform SAXPY on 1M elements
saxpy<<<(N+255)/256, 256>>>(N, 2.0f, d_x, d_y);
err = cudaGetLastError();
printf("LastError %d\n",err);
-------------
今回のケースだと、古いアーキテクチャのKeplerで動くようにはできてませんというエラー。nvcc のパラメータでターゲットを指定できるのではないかと調べると、やはりありました。
下記のように -arch sm_37 と指定すれば、「古いアーキテクチャだからそのうちサポートしなくなるよ」という警告が出るもののちゃんとコンパイルできる。
C:\test>nvcc -arch sm_37 hello.cu
nvcc warning : The 'compute_35', 'compute_37', 'compute_50', 'sm_35', 'sm_37' and 'sm_50' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).
hello.cu
これでOK. ちゃんと、a.exe は期待通りの動作をするようになった。
Step 2. CUDA Toolkit のサンプルプログラム nbodyを動かす。
CUDA Toolkitにはサンプルプログラム一式もついてくる。そのうちnbodyのありかは下記.
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.3\5_Simulations\nbody
ここにある nbody_vs2019.sln を Visual Studio 2019で開き、ソリューションのビルドをすれば完了。
だが、Visual Studioから実行をかけると下記のように即終了してしまう。本来はウインドウが開いて質点が動き回わる様子が表示されるはずなのだが。
...(省略)...
CUDA error at C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.3\5_Simulations\nbody\bodysystemcuda_impl.h:188 code=304(cudaErrorOperatingSystem) "cudaGraphicsGLRegisterBuffer(&m_pGRes[i], m_pbo[i], cudaGraphicsMapFlagsNone)"
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.3\bin\win64\Debug\nbody.exe (プロセス 13336) は、コード 1 で終了しま した。
デバッグが停止したときに自動的にコンソールを閉じるには、[ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自 動的にコンソールを閉じる] を有効にします。
このウィンドウを閉じるには、任意のキーを押してください...
この原因は、グラフィクス出力が必要だけど計算をしているTESLA K80にディスプレイ出力が無い、ということらしい。グラボでCUDAの場合はそのグラボにディスプレイを接続して解決だけど、K80にはもともとディスプレイ出力機能は無いし... で、はたと思いついた。グラフィクスはCPU側で行っているのだから nbodyのパラメータにある -hostmem を指定してデータをホスト側メモリにストアさせればいけるんでないかい。試してみるとビンゴ。無事に画面が開いた。DOS窓から実行形式を起動する場合のパラメータの指定方法は書くまでもないが、Visual Studioから起動する場合は、デバッグプロパティで指定する。
プルダウンメニューの デバッグ > nbodyのデバッグ プロパティ でプロパティページを開き、左のペーンにあるツリーで構成プロパティ>デバッグ を選択。コマンド引数 のところの値が空だけど、そこに-hostmem と書いて OK をクリックする。 ReleaseとDebugの二つの構成のそれぞれに行っておく。
なお、Debug構成でビルドしたものとRelease構成でビルドしたものでは実行速度が格段に違う。Release だと光点がびゅうびゅん飛び回る. K80の半分しか使っていないけど約 1TFLOPS.
以上はソフトの話だが、Tesla K80 の冷却で試行錯誤した話はこちら。
またもや熱に敗れる - 理乃美
横から風をあてて冷却をこころみたのがこちら。Tesla K80の熱は手ごわい - 理乃美
強力なファンに変えて、冷却はできたけど... というのがこちら。Tesla K80 の発熱に勝った..のか? - 理乃美