GPUに入門している今日このごろです
こんにちは、こんばんは。
かえるのクーです。もうすぐ冬眠なので、冬支度中です。
GPUなんてまだ要らない。といい続けてきましたが、GPUを買ったことがむしょうに嬉しい自分にちょっとびっくりしています。
CUDAについては思いのほか情報がたくさんあり、書籍を買おうかと思っていましたが、とりあえずはネットの情報を確認中です。
はじめてのCUDA
さて、今日は CUDAに付属しているのサンプルプログラムをコンパイルして、実行してみたいと思います。早速コンパイルしてみました。
いちおう整理しておきます。
CPU:Intel Core i7-2700K
GPU:nVidia GTX 1060 6GB
OS:Windows 10 64bit Ver.1803(Build 17134.407)
CUDA:9.2, V9.2.148
cuDNN:Ver.7401(7.4.1):サンプル・チュートリアルには不要ですがCuPy用に入れました
MSVisualStudio:Community 2015(Version 14.0.25431.01 Update3)
自分の備忘のために書けば、CUDAのバージョン確認はnvcc -V
です。ちなみに cuDNNはC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include\cudnn.h
のヘッダを見ればわかるそうで、それで確認しました。
最初はお約束でひっかかりました
2017のCommunicationの最新版をインストールしたら、
CUDAの host_config.hにひっかかり、コンパイルエラーがでてしまいました。
強制的に直して進めるのもありかもしれませんが、苦労したくないので、
VisualStudio Community 2015 を入れることにしました。
MSVSはCUDAより先にいれなければならない認識なので、いったんCUDAまでをアンインストールして改めてインストールします。
参考にしていたページにも
-- unsupported Microsoft Visual Studio version! Only the versions 2012, 2013, 2015 and 2017 are supported!
がでたら潔く2017ではなく2015を使うべし!
と書いてあります。コンパイル手順については以下を参照させてもらいました。
NVIDIA CUDA ツールキット 9.2 のインストール
皆様も、CuPy使うなら「今は」CUDA 9.2、& CUDA 9.2のサンプルをWindows でコンパイルするなら「今なら」MS VS 2015でどうぞ!
ちなみに CUDAのhost_config.hには
#if _MSC_VER < 1600 || _MSC_VER > 1913
#error -- unsupported Microsoft Visual Studio version! Only the versions 2012, 2013, 2015 and 2017 are supported!
#elif _MSC_VER == 1600 /* _MSC_VERION == 1600 */
...
とあるので、CUDA 9.2でサポートしているのは Visual Studio 2017 version 15.6.7(_MSC_VER=1913)までであることがわかります。
なので、それ以降の2017(もちろん最新版も)もそのままでは不都合のようです。
Visual Studio 2017を使うなら、version 15.6.7 以前を探してインストールください。
さて、サンプルプログラムは
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v9.2
にありましたので、さっそくVS 2015のソリューションを開いてみます。
各バージョン用のソリューションファイルがありましたが、Samples_vs2015.sln を開いてコンパイルしてみます。
2015でコンパイルすると1割くらいがエラーでNGでしたが、結構通りました。
1時間弱でコンパイル(163ソリューション)が終わったので、nbody.exeを実行してみます。
nbodyを実行してみる
nbody
は多体系のシミュレーションを行うプログラムです。
一般的に空間に多体があると、その重力相互作用の計算は多体数に応じて爆発的(おおげさ)な計算量が必要となります。
昔からスーパーコンピュータの領分の計算だったようです。
nbodyプログラムは論理的なFLOPSではなく、実効的なFLOPSがおおよそ求まるのでベンチマークとしてまぁまぁ使われるようです。どこにexeファイルができるか知らないので、nbody.exeを検索して実行してみます。。。あれ?全然性能がでていません。18.6GFLOPSくらいです。
・
あ、デバッグでコンパイルしていました。リリースでコンパイルしなおします。
1499.3GFLOPSでした。
標準的なGTX 1060 6GBの論理値は 4.4TFLOPSらしいので、1.5TFLOPSならそれらしい数値のような気がします。
CPUでは Core i7-2700Kは理論値が30GFLOPS程度のようです。
nbodyではcpuでの実行もオプションであるのでやってみました。
おおむね 1.9GFLOPSから 2.0GFLOPSでした。
標準のGPUのモードで実行すると、早すぎてなにが起こっているのかわかりません。スライダーでいろいろ調整できます。
うまく調整すれば、銀河団とクラスター&ボイド宇宙が出来上がるかもしれません。
プログラムを実行すると、
NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
と表示されるとおり、サンプルプログラムは性能測定用ではないのでしょうが、目安にはなります。
以下、ビジュアル的におもしろそうなものをやってみました。
BicubicTextureを実行してみる
さて、数値系のサンプルは貼っても面白みにかけるのでビジュアル系のものを貼っていきます。
BicubicTexture.exeはテクスチャのフィルタリングのサンプルです。いきなり目が現れました。お、この目はどこかで見た。。。nVIDIAのロゴの目だ!!
いや、みんなのアイドル、「**」ちゃんでした。(ネタバレになるかもなので、あえて伏字)
ちなみに**ちゃんの写真の全体像は実は裸だそうです。(あ、それ常識ですか。そうですか。)さらに、画像研究でよく使われる画像は肩までのものだそうです。
画像の拡大縮小や、フィルタ種類の変更ができるサンプルです。
bilateralFilterを実行してみる
バイラテラルフィルターはガウシアンフィルターっぽいのに、輪郭がボケないところがトリックです。
fluidsGLを実行してみる
CUDA-FFTとCUDA-OpenGLを使った流体力学系のサンプルです。
ウルトラQ(旧テレビ版)のオープニングごっこができます。ほどよいスピード感です。(ウルトラQを知っているのは助手の入れ知恵です)
あ!逆再生はできないので、偶然に期待しましょう。
ウルトラセブンのほうをはってみます。
smokeParticlesを実行してみる
もくもくと煙を吐く球体が飛びます。
スライドバーの値を変えられたり、右ボタンで表示をいろいろ変えられます。
これも動くので楽しいです。
oceanFFTを実行してみる
FFTで計算された海面のシミュレーションです。水の粘性とはちょっと違っているのか、リアリティには少し欠けますが、うねうね動くので楽しいです。
これは見る方向ぐらいしか変えられませんでした。
particlesを実行してみる
粒子が落下して飛び跳ねる様子を楽しむシミュレーションです。壁との衝突や粒子間の相互作用をシミュレートします。
粒子の属性をかえて、飛び跳ね方やまとまり方を調整できます。
marchingCubesを実行してみる
マーチングキューブ法というポリゴン変換のアルゴリズムを使ったサンプルです。
医療用画像の立体化にも使われることがあるそうです。
ほかにもいろいろありますので、CUDAを入れてまだデモ・シミュレーションで遊んでいない方はぜひ実際に実行してみてください。
サンプルの内容や使用している機能の一覧はこちらです。(CUDA 10のものです)
CUDA Samples :: CUDA Toolkit Documentation
敗北宣言
GPUが買えなくて「まだ要らない」と言っていましたが、こんなにおもしろいなら無理をしてでも、もっと早く買えばよかったです。
今日得た知識:**ちゃんの写真の由来について
由来をしらない人はネットで検索「特定せよ!」w
何事にも、物語があるのですね。。。