flying penguin

Ubuntuが好きな管理人二人がお送りする技術ブログ。

【第一回】チンパンでもCUDAを学ぼう【触りだけ】

f:id:chicken-pizzax:20160609220403p:plain
こんにちは。pizzaxです。先日初めてコメントを頂き嬉しい限りです。こんなひよっこブログにコメントを頂きありがとうございます。

今日はCUDAについて学びましょう。CUDAの解説記事はそこらへんにありますが、初心者向け記事がどうも甘く、敷居が高いと感じています。広い窓口になりたいと思いました。そんな人のために。書いている人がチンパンジーなので、誰でも分かるはずです。

こんな人向け

  • CUDAって何?調べたけどよくわからん
  • CUDAって使うと何が幸せ?OpenMPでよくね?

こんな人向けではない

  • パフォーマンスチューニングしたいんだ早く教えろ!
  • 並列粒度の抽出方法が知りたい

今回は触りだけなので、流し見程度に読んでみましょう!
それでは行ってみましょう。

CUDAって何?

NVIDIAGPUを用いてプログラムを高速化しようぜ!って奴です。
細かいことはそこらへんで見ましたよね。そんな事は大事じゃないんです。

何が幸せになるの?

単純にプログラムが早くなります。画像処理(車載だけかも)において数msecはとても大きな差なのです。
一般的にリアルタイムと言われる30FPSを出す為には、動画1フレームあたり約33msecで処理する必要があります。
例えば、顔検出や色調の変更などをリアルタイムで行うためには欠かせない技術となっています。

車載業界(僕)をはじめ様々な分野で大注目の技術なのです。(画像処理のみならず、科学のメインフレームを用いるような計算でも使われるようです。)世界クラスのメインフレームにも積んである事から、とても優れた高速性を持つ事がわかります。似たような(似てないかも)技術にOpenMPがありますが、アレと比べても段違いにデバイスに近いコーディングができるので、
どちらも本気を出した状態で比較すると間違いなくCUDAの方が高速でしょう。

仕組みを簡単に

簡単に言えばタダの並列化でございます。
C言語のfor文を100回、ループさせるとします。
例えば、以下のような文です。

for (i=0; i<100; i++){
 ans[i] = a[i] + b [i]
}

このようなプログラムは簡単に高速化できます。これは当然1スレッドで実行しています。

CUDAに書きなすとこんな感じです。↓

ans[threadIdx.x] = a[threadIdx.x] + b[threadIdx.x]

一行でかけてしまうのです。これを100スレッドで実行するのです。

こんなに単純な計算ではありませんが(とても大事!)
前者は計算に100回分のコストが掛かりますが、
後者は1回分のコストで済むのです。こんな感じで高速化します。



一年間車載でCUDAを扱ってきましたが、結局は早くしたいって事しかわかりませんでした。これだけでやれるってことですね

如何でしょうか。CUDAを使えば早くなるぜ!って事が分かっていただければもうこの記事は必要ありません。

次回はチンパンでも分かるCUDAコードを解説しようと思います。
CPUの画像処理とCUDAの画像処理どっちが早いかを分かりやすく解説します!
次回[第二回]チンパンでもCUDAを学ぼう[OpenCV vs CUDA] 数日中に書きます。

読んで頂きありがとうございました。

余談

車載で用いるGPUは消費電力が少ない為、TITAN Xなどを用いれば余裕でリアルタイム処理できるのに。。。って事がよくあります。
限られたリソースだからこそ、1msecを削る世界なのです。(パフォーマンスチューニングは闇が深い)
コードを書いてデバッグしてからが始まりですからね。。まだ早くなるに限界はありません。アルゴリズムを変更したり、
選択肢が多すぎて先の見えない調整を続けるのです・・・・・(そして死ぬ)