クーの自由研究

マスターの かえるのクーは8年の任期を終え消失しました。クーⅡ世の中の人絶賛募集中です。(特にオリオン座&プレイアデス方向の方は優遇します)助手がメイド喫茶から生還し、リハビリを兼ねて復帰しています。

CUDAのサンプル/チュートリアルをやってみる

GPUに入門している今日このごろです

 こんにちは、こんばんは。

かえるのクーです。もうすぐ冬眠なので、冬支度中です。

f:id:np2LKoo:20181202005157j:plain


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くらいです。

f:id:np2LKoo:20181202002051p:plain


あ、デバッグでコンパイルしていました。リリースでコンパイルしなおします。

f:id:np2LKoo:20181202010036p:plain

1499.3GFLOPSでした。f:id:np2LKoo:20181202010059p:plain

標準的な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のロゴの目だ!!

f:id:np2LKoo:20181202010840p:plain

いや、みんなのアイドル、「**」ちゃんでした。(ネタバレになるかもなので、あえて伏字)
ちなみに**ちゃんの写真の全体像は実はだそうです。(あ、それ常識ですか。そうですか。)さらに、画像研究でよく使われる画像は肩までのものだそうです。
画像の拡大縮小や、フィルタ種類の変更ができるサンプルです。 

 

bilateralFilterを実行してみる

バイラテラルフィルターはガウシアンフィルターっぽいのに、輪郭がボケないところがトリックです。

f:id:np2LKoo:20181202011604p:plain

 

fluidsGLを実行してみる

 CUDA-FFTとCUDA-OpenGLを使った流体力学系のサンプルです。

ウルトラQ(旧テレビ版)のオープニングごっこができます。ほどよいスピード感です。(ウルトラQを知っているのは助手の入れ知恵です)

f:id:np2LKoo:20181202012423p:plain

あ!逆再生はできないので、偶然に期待しましょう。

ウルトラセブンのほうをはってみます。

 

smokeParticlesを実行してみる

 もくもくと煙を吐く球体が飛びます。

f:id:np2LKoo:20181202013947p:plain

スライドバーの値を変えられたり、右ボタンで表示をいろいろ変えられます。

これも動くので楽しいです。

 

oceanFFTを実行してみる

 FFTで計算された海面のシミュレーションです。水の粘性とはちょっと違っているのか、リアリティには少し欠けますが、うねうね動くので楽しいです。

f:id:np2LKoo:20181202014922p:plain

これは見る方向ぐらいしか変えられませんでした。

 

particlesを実行してみる

 粒子が落下して飛び跳ねる様子を楽しむシミュレーションです。壁との衝突や粒子間の相互作用をシミュレートします。

粒子の属性をかえて、飛び跳ね方やまとまり方を調整できます。f:id:np2LKoo:20181202020102p:plain

 

marchingCubesを実行してみる

 マーチングキューブ法というポリゴン変換のアルゴリズムを使ったサンプルです。

医療用画像の立体化にも使われることがあるそうです。

f:id:np2LKoo:20181202024631p:plain

ほかにもいろいろありますので、CUDAを入れてまだデモ・シミュレーションで遊んでいない方はぜひ実際に実行してみてください。

サンプルの内容や使用している機能の一覧はこちらです。(CUDA 10のものです)

CUDA Samples :: CUDA Toolkit Documentation

敗北宣言

 GPUが買えなくて「まだ要らない」と言っていましたが、こんなにおもしろいなら無理をしてでも、もっと早く買えばよかったです。

今日得た知識:**ちゃんの写真の由来について

由来をしらない人はネットで検索「特定せよ!」w

何事にも、物語があるのですね。。。