GPGPUプログラミング (CUDA / OpenGL GLSL)

GPGPU (汎用GPU) プログラミングは、グラフィックスプロセッサが持つ数千の並列コアを、グラフィックス以外の計算に利用する手法である。密なRGB-D SLAMはこの分野における「キラーアプリ」であった。KinectFusionのようなパイプラインの各段階——ピクセルごとの深度フィルタリング、ボクセルごとのTSDF融合、ピクセルごとのレイキャスティング——はいずれも、ピクセルまたはボクセルに対するembarrassingly parallel(自明に並列化可能)なマップ処理であり、まさにGPUが得意とする形である。CPU上で30 Hzのリアルタイム密SLAMを実現するのは事実上不可能であり、これらのループをGPUに移した瞬間に初めて可能になった。

CUDAの概要

CUDA (NVIDIAのGPGPUプラットフォーム) は、GPUを軽量スレッドの格子として提供し、それらすべてが同一のカーネル関数を実行する。

典型的なSLAMカーネルには、深度マップのバイラテラルフィルタリング、深度から頂点マップ・法線マップを計算する処理、TSDF統合(カメラフラスタム内の各ボクセルに1スレッドを割り当て、そのボクセルを深度画像へ投影して加重移動平均を更新する)、そしてフレーム対モデルトラッキングのためのTSDFレイキャスティングがある。

並列リダクションはもう一つの重要なパターンである。射影データ対応ICPは、6×66 \times 6のGauss-Newton系を、数十万ピクセルにわたる項JiTJiJ_i^T J_iJiTriJ_i^T r_iの総和として計算する。各スレッドが自分のローカルな積を計算し、シェアードメモリ内でのツリー構造のリダクションがブロックごとに総和を取り、最終パス(またはアトミック演算)でブロック間の結果を結合する。CPUに戻されるのは、小さな6×66 \times 6の系のみであり、そこで解かれる。

計算手段としてのOpenGL GLSL

CUDAが登場する以前、そしてCUDAと並行して、GPGPUはグラフィックスパイプラインを通じてGLSLシェーダーを用いて行われてきた。いくつかの影響力のあるRGB-Dシステム(特にElasticFusion)はこの方式で書かれている——CUDAと異なりベンダー中立であるという利点もある。

実践的な指針

SLAMにおける意義

ハンズオン

関連ノート