第14回目の今回は、「GPGPU」について説明します。

GPUとは?

GPU(Graphics Processing Unit:グラフィックス・プロセッシング・ユニット)は、描画処理のための専用プロセッサです。コンピュータの通常使用時(文書作成や表計算など)の画面描画処理に加え、動画再生処理、3Dゲームや3D CGなどの3Dグラフィックス処理を行うためのものです。

GPUで行える処理は、汎用的な計算を行うために設計されているCPUで行うことも可能ですが、グラフィックス処理をGPUにまかせることでCPUの負荷を軽減することができます。また、3Dグラフィックスのように計算量の多い処理では、CPUの演算速度が追いつかずコマ落ちが生じる可能性があるため、そのような用途ではGPUが必要となります。

GPGPUとは?

3Dゲームや3D CG作成用途でもない限り、通常のコンピュータの使い方(文書・プレゼン資料の作成、インターネットでの検索など)では、3Dグラフィックスの処理が必要なケースはほとんどありません。つまり、3Dゲームや3D CG作成用途以外では、GPUの本来の処理能力の極一部しか使っていません。そこで、3Dゲームや3D CG作成などのグラフィックス用途以外でもGPUを活用しようというのが、GPGPU(General Purpose computing on Graphics Processing Units)のコンセプトです。コンピュータビジョンの入力となる画像は、2次元配列のデータであり、処理内容によっては並列計算、行列演算が得意なGPUが大いに役立ちます。

GPGPUに対応しているGPUとしては、NVIDIA製が最も有名で、GeForceシリーズ、Quadroシリーズ、Teslaシリーズがあります。GeForceシリーズは3Dグラフィックスや動画編集向け、Quadroシリーズは3D CGやCADなどのデザイン、医療用グラフィックス向け、TeslaシリーズはGPGPU専用です。

GPU以外に必要なもの

GPUは、本来グラフィックス処理を行うためのものなので、マザーボードにGPUを挿しただけではグラフィックス系の処理しか行ってくれません。つまり、CPUで処理することを前提に作られたソフトウェアは、GPUでは処理することができません。そこで必要になるのがCUDA(Compute Unified Device Architecture)です。

CUDAは、NVIDIAのGPUでグラフィックス以外の汎用的な処理を行うプログラムを開発する際に用いる、統合開発環境です。GPUで汎用的な処理を実行するためのコンパイラ(nvcc)や、ライブラリなどから構成されています。NVIDIA製のGPUを購入しただけではGPGPU用途では使えません。CUDAをインストールするようにしましょう。

GPGPUでできること

GPGPUは、汎用的な処理をGPUで行うためのものだと説明しましたが、どんな処理でもGPUにやらせれば良いというわけではありません。GPUはもともとグラフィックス処理のために開発されたプロセッサであり、並列計算、行列演算を得意としています。

GPGPUが得意としている分野として、シミュレーション(物理シミュレーション、流体計算・気候シミュレーション、天体シミュレーションなど)があります。また、暗号解読、音声処理もGPGPUが得意とする分野であると言われています。

コンピュータビジョン分野におけるGPGPU

コンピュータビジョンのライブラリのデファクトスタンダードであるOpenCVは、GPGPUに対応しています。GPUの機能を有効にしたい場合は、CUDAを使用するフラグをオンにしてコンパイルする必要があります。コンパイル方法はネットですぐに見つかるため、是非試してみてください。処理内容にもよりますが、全てをCPUで処理する場合と比較して、例えば高速に歩行者検出処理を実行できます。

歩行者検出以外では、Viola-Jonesの顔検出、2台のカメラで3次元計測を行うステレオカメラ、フィルタ処理などの基本的な画像処理、キーポイント検出などがGPGPUに対応しています(図1)。使用するGPU、処理内容にもよりますが、最大で30倍もの速度を実現していることが見て取れます。

図1 OpenCVの各処理の処理速度比較結果(CPU vs GPU)

図1 OpenCVの各処理の処理速度比較結果(CPU vs GPU)
(出展:http://opencv.org/platforms/cuda.html)

大量の画像を学習させる際に膨大な時間を要するディープラーニング(Deep Learning:深層学習)でも、GPUは効果を発揮します。Tensor Flow、Caffe、ChainerなどのフレームワークはGPGPUに対応しているため、比較的簡単にGPUを活用できます。

何十万、何百万画素という画像を処理するコンピュータビジョン分野では、1枚の画像を処理するのに数秒、あるいは数分かかることも珍しくありません。処理時間を少しでも短くしたい場合は、GPUの活用を検討してみてください。 ここで紹介しているNVIDIA以外に、AMD、Intel、ARMの製品もGPGPUに対応しています。CUDAは基本的にNVIDIAのGPU用ですが、「混種混在環境での並列プログラミングのオープンな標準規格」であるOpenCLというものもありますので、興味のある方は試して見てください。

次回は、OpenCVに実装されているカメラキャリブレーションの概要について紹介します!