
はじめに
当サイトでは、GPU/CUDAによる高速プログラミングの初心者向けの解説を行っていきます。
CUDA入門の情報は、NVIDIAさんや他の方がすでにネットに上げられていますが、わりと原理・原則からの説明が多く、初心者がちょっと触れてみるには、心理的なハードルがまだ高いように感じています。
なので、当サイトでは必要以上の情報は削ったうえで、初心者がコーディングが一通りできるまでの知識を一通り解説をしていきたいと思います。
CUDAとは?
NVIDIA製GPUで動作する開発環境です。
グラフィック用途以外の汎用的な処理にもCPUの強力な処理性能を利用することができ、重い処理を簡単に高速化することができます。
GPUでの汎用的な処理のことを、
GPGPU (General-purpose computing on graphics processing units )とも呼びます。
なお、 AMDのGPUでは動作しません。
どれくらい高速化できる?
CPUの処理と比べて、どれくらい高速化できるでしょうか?
処理や条件によって違いますが、以下のような処理で試してみましょう。
・ 8000×8000のint型 二次元配列で、ある要素を中心として、その周辺3x3の平均値を求める。
・結果を別の二次元配列に保存する。
・この処理を全要素に行う。

処理時間は以下の通り。
プロセッサ | 処理時間(msec) |
CPU (Intel Corei7 8700 3.2GHz) | 約198 |
GPU (NVIDIA GeForce1070) | 約3.4 (+転送時間 44msec) |
処理時間のみなら50倍、転送時間を含むと5倍ほど高速化しています。
どちらも、とくべつ最適化をしていない状態です。
扱う難易度は?
CやC++を使ったことがあるなら、その延長上でコーディングできるため、容易に使いこなせるようになるでしょう。
もちろん突き詰めて高速化していくなら、GPUの特性を深く理解する必要があります。
しかし、そこまでしなくても十分に高速化することができます。
CPUとGPUの違い
CPUとの最大の違いは、CUDAコアと呼ばれる数千個ものコアが存在し、大量のスレッドで一気に並列処理ができることです。
CPUのコア数は多くても十数個なので、処理によっては何十倍~百倍近い速度差が出ることがあります。
1コアあたりのクロック数はCPUのほうが上ですが、GPUの並列処理の性能を活かすことができれば、大幅に高速化することが可能です。
ユニット | コア数 |
GeForce RTX2080 | 2944(1.515GHz) |
Intel Core i7-9700K | 8(4GHz) |
GPUの種類
GPUの種類には以下のようなものがあります。
種類 | 解説 |
GeForce | 一般向け 主にゲームに利用される |
Quadro | 産業向け 信頼性が求められる場面で利用される 価格が高い |
Tesla | 研究開発向け 信頼性も価格も最も高い スパコンなどにも用いられている |
信頼性と価格はQuadroとTeslaが高いですが、同ランクの製品で速度を比較すると、実は僅かにGeForceのほうが早いです。
CUDAを利用するとメリットのあるケース
画像処理や大量の計算処理、機械学習など、重くなりがちな処理に対して非常に有効です。
ボトルネックとなっている処理を一気に高速化することが可能です。
逆に軽い処理については効果が低いです。
軽い処理だと、GPUにデータを転送する時間や、その他処理のオーバーヘッドの割合が多くなってしまうからです。
CUDAの欠点
CUDAには以下のような欠点があります。
逐次的な処理は高速化しづらい
・前の処理の結果がわからないと、次の処理が開始できない。
・処理自体は並列化できるが、同じメモリアドレスへのアクセスがスレッド間で同時に行われてしまう。
といったケースでは並列化しづらく、逐次的になりがちです。
GPUのクロックはCPUよりも低いため、逐次的な処理だと高速化しづらくなります。
ただ、それでもCPUより高速化することは十分可能です。
コーディングの仕方によって平気で数十倍の速度差が出やすい
最適化するなら、「シェアードメモリ」や「テクスチャメモリ」といったGPU特有の機能を利用する必要があります。
これらは使用できるシチュエーションが限定されていますが、使用しなかった場合の速度差があまりに大きいため、「コーディングに慣れているかどうか」で速度差がでやすいです。
可読性が低くなりがち
基本的には「多少コードが複雑になってもGPUの機能を無理やり利用する」ほうが高速化できるため、コードが複雑で可読性は低くなりがちです。
CPUよりもコーディングの工数がかかる
コードが複雑で可読性が低くなりやすいため、コーディングはもちろん、デバッグにも時間がかかります。
「コメントを大量に残してある上に、自分で書いたはずのコードですら訳が分からない」といった事態になることもあります。
また、比較的簡単な処理でも、大量のスレッドが動くため、デバッグ時に処理を追跡しづらく、バグがあった場合はコードとにらめっこになる時間が長くなりがちです。
どこまで高速化できるかが見えづらい
CPUと比べて、早くできるときは何十倍と早くできますが、作ってみないことには実際にどこまで高速化できるかが見えづらいです。
そのため、初めから高速化できることを見込んでプロジェクトを進めると、後々大ヤケドをすることになります。
開発環境
WindowsまたはLinuxに向けて開発環境が提供されています。
Visual Studio上で開発が可能です。
CUDAのバージョンによって、対応するVisual Studioのバージョンが違うので注意しましょう。
CUDAバージョン | Visual Studioバージョン |
10.0 | 2012~2017 |
学習にオススメなのはWindows版です。
NVIDIAの社員の方いわく、「どうしても開発環境などの提供がWindows版よりもLinux版は遅くなる」とのことなので、それを考慮して環境を選択しましょう。
最後に
CUDAでプログラミング行う以前の超基本的な情報をご紹介しました。皆さんが一通りCUDAを扱えるように情報を追加していきますので、よろしくお願いします。
