CUDA今までCUDAのインストール方法や、CUDAが必要なGPU版Tensorflowの環境構築などはやってきたのですが、今回は純粋にCUDAを使って並列プログラミングしてみたいと思います。GPU(ビデオカード)は画面描画などに使われるためのハードウェアであり、故に並列計算の機能が高速です。これは、ディスプレイの各ピクセルを描画することを考える場合、大量の並列計算を高速にこなす必要があるためです。CPUのコア数が近年8コアなどが多いのに対し、GPUは数千個クラスの並列コア数を持ちます。故に、そのGPUの機能を画面描画だけではなく、汎用計算に用いて計算を高速化しようという試みは、ここ10年くらいで急速に流行ってきた感はあります。いう話ですが、NVIDIA製のGPUを使っている場合には、CUDAを使うのが楽です。CUDAはNVIDIAが開発しているGPU向けの汎用並列プログラミングモデルであり、C++を拡張したものなので、C++のプログラミングに慣れている人なら割とすんなりと動かすことができると思います。いうのがありますが、どんなプログラムでも速くなるわけではありません。GPUは単純並列計算向けのため、if文などが大量に入るソースコードでは十分な並列化性能を発揮できないあたりの理由から、データ転送が多いコードや、if文が多いコードに適用しても、それほど並列化性能は望めないと考えられます。前置きが長くなりましたが、早速CUDAのプログラムを作ってみましょう。今回はCUDAがインストール済の状態からスタートしますので、CUDAのインストールは以下の記事を参考にしてください。10)上記記事はCUDA8.0の環境構築ですが、今回はCUDA9.0を使いました。基本的にはCUDA8でもCUDA9でも同じように動くとは思います。インストール済プログラミング方法いくつかやり方があると思いますが、今回はコンソールアプリケーションを作成し、その中でCUDAのプログラムを動かしていきたいと思います。コンソールアプリケーション」を選択していきます。プロジェクト名は任意ですが、ここでは「CUDATestApp1」としました。アプリケーションウィザードで「空のプロジェクト」にチェックを入れ、完了します。これにてプロジェクトの作成は完了です。CUDAのコードを追加プロジェクトができたので、CUDAのコードを追加してみます。ソリューションエクスプローラーからソースファイルフォルダを右クリックし、追加⇒新しい項目で、新しいファイルを追加します。今回は「.cu」形式のファイルを追加します。これはCUDAのコードを記述できるファイルです。File」を選択し、適当な名前を付けて追加します。ここで左タブにCUDAがない場合には、CUDAのインストールが正常に行われていない可能性があるため、CUDAのインストールをやり直すなど、見直した方がいいかもしれません。これで、「.cu」のファイルが追加されたと思います。デフォルトでは何も書かれていないため、中身は空っぽです。ビルドのために必要な設定さて、それではビルドのために必要な設定をいくつか見ていきましょう。ビルドカスタマイズファイルの選択まず初めに、ソリューションエクスプローラーからプロジェクト名を右クリックし、「ビルドの依存関係」⇒「ビルドのカスタマイズ」をクリックしてください。すると、以下のようにカスタマイズファイルが選択できます。デフォルトではCUDA9.0が選ばれていなかったので、CUDA9.0にチェックしてOKを押します。ビルド構成をRelease/x64にしておく今回はRelease/x64でビルドすることを前提に進めます。ソースコードがビルドに「含めない」になっていないか確認する(2)のところで追加した「.cu」形式のソースコードがビルドされる対象になっていないケースがあります。下の画像が見づらいですが、追加した「.cu」形式のコード(私はcudatest.cuとしました)の上で右クリックし、プロパティを開きます。ここで「ビルドに含めない」に設定されている場合、コードがビルドされません。C/C++」に変更し、ビルドから除外を「いいえ」に設定します。これで、cudatest.cuがビルドの対象となりました。CUDAのライブラリをリンクする最後にCUDAのライブラリへのリンクを行います。プロジェクト名を右クリック⇒「プロパティ」からプロジェクトのプロパティページを開きます。左タブ「リンカー」⇒「全般」より、「追加のライブラリディレクトリ」を選択し、ライブラリディレクトリへのパスを追加します。Toolkit\CUDA\v9.0\lib\x64」がライブラリのパスでした。Toolkit」というフォルダの中にあるlibフォルダ(x64)を指定すればよいです。次に追加の依存ファイルを追加します。ここでは「cudart_static.lib」を追加しました。これでライブラリへのリンクは完了です。テストコードを実行する以下にCPUとGPUで同じ計算を行うテストコードを置きました。設定が正しく行われていれば、本コードのビルドを行うことができるはずです。計算するプログラムです。25行目でNの数を設定でき、N=100なら100個の乱数に対し、”SINΘ×SINΘ+COSΘ×COSΘ”が計算され、最後に確認のために総和が計算されます。“SINΘ×SINΘ+COSΘ×COSΘ”はΘの値によらず1なので、N=100なら最終結果は1が100個で100になります。比較用にCPU用関数(C++ベース)とGPU関数(CUDA利用)を用意しており、6~10行目がGPUを使用した場合、13~18行目がCPUを利用した場合です。false;」とすればCPU版関数で動作するので、計算時間の比較を行うことが可能です。GPU動作:235[ms]と、CUDAを使った場合の方が遅いという結果になりました。Nを増やしたときにCPUの場合は動作時間が素直に10倍近くになっているのに対して、GPU動作の場合は過度に増えておらず、並列計算の高速化自体は上手く働いていそうな雰囲気です。今回のプログラムは”SINΘ×SINΘ+COSΘ×COSΘ”を計算するだけのプログラムであるが故に、GPU側に領域を確保したり、データコピーをしたりする部分の処理時間のオーバーヘッドが大きく、そのあたりのオーバーヘッドがないCPU動作の方が早くなっているような気がします。あとはGPUそのものの性能があまり高くないからかもしれません。いきませんでしたが、CUDAのコードをビルドし、動作することを確認できました。今回はテストコードの内容についてもあまり説明できなかったため、今後はそのあたりも紹介しつつ、CUDAを使うことで高速化が見込めそうなプログラムには、どんどんCUDAを適用していけるように勉強していきたいです。自分が使っているPCの画面を動画として保存したいということがあると思います。10)前回、CUDAの導入方法について説明しましたので、今回はcuDNNの導入について説明したいと思います。10)そういえば自宅のPCにCUDAを入れていなかったことを思い出したので、自宅でもCUDAが使えるように導入をすることにしました。前回の記事「Tensorflow+Kerasの環境構築」でTensorflow+Kerasの環境構築をしました。10)前回cuDNNの導入について説明したので、いよいよTensorFlowの環境構築に入りたいと思います。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。