あまりにグラブルのガチャが酷かったので、気分転換にCUDAでも触ってみようかなと思いまして、作業メモを残しておくための記事です。実はここ、グラブルの記事のためだけのブログじゃないんですよ。
CUDAとGPGPU
nVidiaのGPU向けのGPGPUプラットフォーム。なんか便利な関数がいっぱいあるらしい。GP(General Purpose) – 汎用ということで、元々はグラフィック特化の演算用チップだったGPUを、グラフィック処理以外の用途で使うというメソッド。ASIC/FPGAと並んでハードウェアアクセラレータとして利用されている。
(最近、GPGPUってキーワードあんまり聞かない気がするけど)
ASIC/FPGAに対しての強みは、演算処理ユニットの集積度と単価の安さ。元々がグラフィック処理用途のため、最先端の微細プロセスを使っており非常に高集積。理論FLOPSは他の追随を許さない。
しかし欠点は、そもそもがグラフィック処理用途であるということ。特定の演算を実現するために適したものではないが豊富な処理ユニットの数で殴れば、専門のチップよりも早いんじゃない?っていう発想。グラブルに例えるなら、闇背水PTで他属性を殴るみたいな感じ。でもそういうケースだと、消費電力あたりの計算能力ではFPGAとかに負ける。
まぁ最近は科学技術計算用途にnVidiaがチップ作ってるけど。QuadrorとかTeslaとかはそのシリーズだったはず。アーキテクチャがどう違うかまでは知らない。
環境
多分nVidiaのGPUがあればできる。自分の環境ではGTX 1070 Ti。対応表はここ。1070 Tiはたぶん6.1まで対応。
あと、IDEとしてはVisual Studioと連携できるので、別途入れておく。最近は個人利用なら無料でもかなりの機能が使えるCommunity版が使えるはず。個人で遊ぶ分には高機能すぎるのでこれで十分。
CUDA Toolkit のインストール
ここらへんから適当にダウンロードしてインストール。
自分の環境に対応したVisual Studioのバージョンに対応した Nsight が勝手にインストールされるっぽい。インストールおわったら再起動を要求されるので再起動。
その後、Visual Studioを起動し、New Projectを作成しようとすると、NVIDIAのCUDAプロジェクトが利用可能になってるので、これで適当に名前つけて作成。
作成して開くと、karnel.cuというファイルに、サンプルソースが入った状態で開かれる。CUDAで行列加算をするというシンプルなもの。main関数を以下に抜粋。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
int main() { const int arraySize = 5; const int a[arraySize] = { 1, 2, 3, 4, 5 }; const int b[arraySize] = { 10, 20, 30, 40, 50 }; int c[arraySize] = { 0 }; // Add vectors in parallel. cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize); if (cudaStatus != cudaSuccess) { fprintf(stderr, "addWithCuda failed!"); return 1; } printf("{1,2,3,4,5} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n", c[0], c[1], c[2], c[3], c[4]); // cudaDeviceReset must be called before exiting in order for profiling and // tracing tools such as Nsight and Visual Profiler to show complete traces. cudaStatus = cudaDeviceReset(); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaDeviceReset failed!"); return 1; } return 0; } |
単純に、行列A + 行列B という処理を行うだけのプログラムで、addWithCuda関数がCUDA呼出部になっている。これをRunさせて、『あーうんうん、なんか動いてるな』って確認できたので、環境構築は完了。
サンプルコードを動かす
5個の行列の足し算ではあまりにGPUに負荷がかからないので、もう少しちゃんとしたサンプルプログラムを動かしてみる。サンプルコードの場所は、C:\ProgramData\NVIDIA Corporation\CUDA Samples に。v9.2 のフォルダをのままコピーしてもってきて、フォルダ内にある『Samples_vs2017.sln』を開く。(バージョンごとにソリューションファイルがある)
サンプルがすごい豊富なんで、しばらくはこれ見てるだけで遊べそうな気がするが、とりあえず一つ動かす。並列計算のド定番である、mandelbrotをやってみる。
マンデルブロ集合の描画を、CPU演算とGPU演算で切り替えしたりとかできる。そして描画範囲を変えると、GPUパワーで演算が行われていることがタスクマネージャで確認できる。