GPGPU 프로그래밍 (CUDA / OpenGL GLSL)

GPGPU (범용 GPU) 프로그래밍은 그래픽 프로세서의 수천 개 병렬 코어를 그래픽 이외의 연산에 활용합니다. 밀도 RGB-D SLAM은 이 분야의 킬러 앱이었습니다: KinectFusion과 같은 파이프라인의 모든 단계 — 픽셀별 깊이 필터링, 복셀별 TSDF 융합, 픽셀별 레이캐스팅 — 는 픽셀 또는 복셀에 대한 병렬화가 극히 쉬운 (embarrassingly parallel) 매핑 연산이며, 이는 정확히 GPU가 잘하는 일입니다. 30,Hz의 실시간 밀도 SLAM은 CPU에서는 사실상 불가능하며, 이러한 루프를 GPU로 옮긴 순간에야 비로소 가능해졌습니다.

CUDA 개요

CUDA(NVIDIA의 GPGPU 플랫폼)는 GPU를 동일한 커널 함수를 실행하는 경량 스레드들의 그리드로 노출합니다:

전형적인 SLAM 커널로는 깊이 맵의 이중선형 필터링, 깊이로부터 정점/법선 맵 계산, TSDF 통합(카메라 절두체 내 복셀마다 하나의 스레드가 해당 복셀을 깊이 이미지에 투영하여 가중 이동 평균을 갱신), 그리고 프레임-대-모델 추적을 위한 TSDF 레이캐스팅이 있습니다.

**병렬 리덕션(parallel reduction)**은 또 하나의 핵심 패턴입니다: 투영 데이터 연관 ICP는 수십만 개의 픽셀에 걸쳐 픽셀별 항 JiTJiJ_i^T J_iJiTriJ_i^T r_i를 합산하여 6×66 \times 6 가우스-뉴턴 시스템을 계산합니다. 각 스레드는 자신의 지역 곱을 계산하고, 공유 메모리에서의 트리 구조 리덕션이 블록 단위로 이를 합산하며, 마지막 단계(또는 원자적 연산)가 블록 결과들을 결합합니다. CPU로 복사되는 것은 오직 이 작은 6×66 \times 6 시스템뿐이며, 여기서 풀이가 이루어집니다.

연산 도구로서의 OpenGL GLSL

CUDA 이전과 그와 병행하여, GPGPU는 그래픽 파이프라인을 통해 GLSL 셰이더로 수행되었으며, 여러 영향력 있는 RGB-D 시스템(특히 ElasticFusion)이 이 방식으로 작성되었습니다 — CUDA와 달리 벤더 중립적이라는 장점도 있습니다:

실무 지침

SLAM에서의 의미

실습

관련 문서