본문 바로가기

Papyrus/Dizzy Report

쿠다(CUDA)의 미래는 밝지 않다



쿠다(CUDA)는 한때의 괜찮았던 기술로 끝날 것인가?



이 질문에 대한 답은 쉽지 않다. 그러나, 과감하게 생각해본다면 쿠다의 미래는 그다지 밝지 않다. 쿠다를 다루어보면 2가지 면에서 놀라게 되는데, 엄청난 처리 속도 때문에 첫번째로 놀라게 되며, 본격적으로 쿠다를 이용한 프로그래밍을 할 때 그 지옥같은 디버깅에 두번째로 놀라게 된다. 쿠다의 프로그래밍 모델 그 자체는 그렇게 난해하지는 않다. 그러나, GPU라는 태생적인 한계 때문에 CPU와 다른 메모리 공간을 사용한다. 커널(kernel, 쿠다에서 많은 수의 스레드를 동시에 동작시키는 함수를 뜻한다) 안의 어떤 변수 값을 살펴보려면, 그 값을 호스트 메모리에 복사해서 봐야 하며, 때로는 코드의 문맥상 이것이 불가능할 때도 있다. 즉, CPU와 GPU 사이의 값이 쉽게 공유되지 않으며, 이것은 호스팅 환경의 평범한 디버거로는 디바이스의 메모리를 디버깅하기 어렵다는 뜻이다. 쿠다는 본질적으로 GPU의 쉐이더를 좀 더 유연하게 사용 가능하도록 확장한 것이기 때문에, 이 문제는 쉽게 해결하기 어렵다. 일반적인 CPU 멀티스레딩 디버깅도 무척 어려운 일인데, 여기에 디바이스 메모리에 접근하는 것도 쉽지 않으니 프로그래머들에게 지옥이 따로 없다. NVIDIA는 비주얼 디버깅을 위해 Parallel Nsight라는 Visual Studio 2008 플러그인을 출시했지만 지원되는 GPU는 제한적이며, 에어로(aero) 테마가 적용된 상태에서는 제대로 동작하지 않는 등, 잡다한 문제가 많다.

쿠다 내부적인 문제로는, 쿠다는 재귀 호출이 허용되지 않는다. compute capability 2.0 모델에서도 __device__ 함수의 재귀 호출은 제한적으로만 허용될 뿐이다. 이와 같은 제어 구조는 GPU라는 태생에서 온 것인데, 쿠다는 본질적으로 데이터 중심의 병렬 처리 구조에서는 매우 강력하지만, 태스크 중심의 병렬 처리에는 적합하지 않다.

그리고 외부적인 요인으로, 인텔의 CPU + GPU 통합 프로세서가 있다. 인텔의 라라비의 독립칩 출시는 물거품이 되었지만, 아키텍처는 살아남아 후속칩에 적용되고 있다. 이종 코어(heterogeneous core) 사이에 존재하는 공유 메모리의 존재는 구원의 손길이다. 여담으로, 소니의 셀(Cell Broadband Engine)이 PPE와 SPE 사이의 공유 메모리만 존재했더라도 그 운명은 크게 달라졌을거라는 말에 전적으로 공감한다.  셀이 추구하는 방향은 틀리지 않았지만, 그것을 뒷받침하는 소프트웨어에 대한 감각이 너무 없었다. 샌디브릿지의 8MB 공유 캐시는 공유 메모리가 아니지만, 현재 샌디브릿지에 포함된 GPU 코어는 언젠가 라라비의 유전자를 지닌 코어가 대신할 것이며, 공유 메모리 구조로 갈 것은 거의 확실하다. 인텔의 CPU + GPU 통합칩 역시 쿠다와 비슷한 C 언어 확장을 제시하지만, 이 공유 메모리의 존재 때문에 코드가 훨씬 간단해진다. 더구나, 인텔의 TBB(Threading Building Block) 및 PPL(Parallel Patterns Library), Clik+, OpenMP의 발전은 극도로 제한적인 쿠다의 커널 함수를 작성하는 것보다 훨씬 직관적으로 코드를 작성할 수 있도록 해준다. 당장은 이들 외부 라이브러리가 쿠다에 비해 성능이 처질지는 몰라도, 장기적으로는 개발의 용이성 때문에 더 넓게 퍼질 것이다. 또, 진화하는 x86 SIMD(AVX와 같은)는 쿠다를 능가할 수도 있다.

어떤 작업은 더 설명하기 곤란할만큼 '자연스러운 병렬화'가 가능하고, 어떤 작업은 작업 의존성 때문에 병렬화가 매우 어렵다. 즉, 병렬화는 지상 과제지만, 데이터 병렬화만 병렬 처리의 전부는 아니며, 불행하게도 쿠다는 데이터 병렬화 이외의 부분에서는 잘 적용할 수 없다. 더구나, CPU 쪽은 벡터 연산 능력을 지속적으로 강화하고 있기 때문에 GPU가 가지는 장점도 시간이 지나면 압도적이라고 말하기 힘들어진다. 발전하는 CPU가 벡터 명령어 처리 능력을 끌어올리기는 쉽지만, 상대적으로 GPU는 CPU가 가지는 프로그래밍 모델 자체의 장점을 흡수하는 것은 쉽지 않다. CPU와 GPU는 한 집에 사는 서로 다른 컴퓨터고, 특히 GPU는 CPU의 몇 배에 달하는 연산 능력을 가지지만 혼자서는 아무 것도 하지 못하는 존재(CPU에 의해 호스팅되는)이기 때문이다.

결론적으로, 누군가가 쿠다는 멀티코어 시대의 대표적인 패러다임이 될 것인가라고 묻는다면, 어렵다고 답할 수 있다. 그러나, 쿠다를 공부할 필요가 있는가라고 묻는다면 그렇다고 할 수 있다. 쿠다는 태스크 중심 병렬 처리에 취약할 뿐, 쿠다의 언어 확장과 같은 접근 방식은 다음 패러다임의 표준에 상당히 근접해 있기 때문이다.