한 줄로 말하면

CUDA는 NVIDIA가 만든 병렬 컴퓨팅 플랫폼이자 프로그래밍 모델이야.1 GPU의 연산력을 끌어와 컴퓨팅 성능을 크게 끌어올려서, 딥러닝·과학 컴퓨팅·고성능 컴퓨팅(HPC) 같은 연산 집약적 작업을 가속하는 데 널리 쓰여.1 대부분의 AI 프레임워크와 라이브러리가 CUDA를 기준으로 짜여 있다 보니, CUDA는 GPU 연산의 사실상 표준 언어가 됐고, 그 표준의 자리를 NVIDIA가 독점하면서 AI 개발자들이 다른 회사 GPU로 옮기기 어려운 잠금 효과까지 만들어.

CUDA는 여러 언어를 GPU로 연결하는 스택이다

CUDA는 C 언어로 작성됐지만 C++·Fortran·Python·Julia 등 다른 언어와 함께 쓰도록 설계됐어.2 C/C++ 개발자는 NVIDIA의 LLVM 기반 컴파일러 nvcc(또는 clang)로 PTX라는 중간 코드로 컴파일되는 ‘CUDA C/C++‘를 쓸 수 있어.2 라이브러리·컴파일러 지시어 외에도 Khronos Group의 OpenCL, 마이크로소프트 DirectCompute, OpenGL Compute Shader, C++ AMP 같은 다른 연산 인터페이스도 지원해.2

스탠퍼드 대학원생의 그래픽 카드 실험에서 시작됐다

CUDA의 뿌리는 2000년대 초, 스탠퍼드대 컴퓨터공학 박사과정생 Ian Buck이 GPU를 그래픽 렌더링 이외의 용도로 실험하던 데서 시작돼.2 Buck은 GPU 범용 컴퓨팅을 위한 프로그래밍 언어 Brook을 개발했고, 2004년 NVIDIA는 그를 채용해 당시 GPU 컴퓨팅 아키텍처 담당 이사였던 John Nickolls와 짝지어 Brook을 CUDA로 발전시키기 시작했어.2 CUDA는 2004년 만들어져 2007년 공식 출시됐고, 이름은 원래 Compute Unified Device Architecture의 약어였지만 NVIDIA는 이후 그 뜻을 거의 쓰지 않아.2 2015년까지 CUDA 개발의 초점은 머신러닝·인공신경망 워크로드를 가속하는 방향으로 점점 옮겨갔어.2

프로그래밍 가이드가 그리는 다섯 단계

NVIDIA가 배포하는 공식 CUDA 프로그래밍 가이드는 CUDA 프로그래밍 모델과 GPU에서 실행되는 코드를 작성하는 방법을 다루는 포괄적 자료이고,1 크게 다섯 부(Part)로 나뉘어.1 Part 1은 언어에 무관하게 CUDA 프로그래밍 모델과 플랫폼을 개괄하고,1 Part 2는 C++와 Python으로 GPU를 프로그래밍하는 기초를 다뤄.1 Part 4는 CUDA 그래프, 동적 병렬성, 그래픽 API와의 상호운용성, 통합 메모리 같은 구체적 기능을 완전히 다루며,1 Part 5 기술 부록은 CUDA의 C++ 고수준 언어 지원과 하드웨어별 사양을 참조 문서로 제공해.1

장점과 한계

CUDA는 임의 주소에서 데이터를 읽는 scattered read, 통합 가상 메모리(CUDA 4.0 이상)·통합 메모리(CUDA 6.0 이상), 스레드 사이에서 공유되는 빠른 공유 메모리 영역 같은 이점을 제공해.2 반대로 제약도 있어 — 스레드는 최상의 성능을 위해 최소 32개 단위(warp)로 실행돼야 하고, 이 SIMD 실행 모델은 레이트레이싱에서 공간분할 자료구조를 탐색하는 것처럼 본질적으로 갈라지는 작업에서 큰 제약이 돼.2 또한 최신 리비전에는 에뮬레이션이나 폴백 기능이 없고, C++의 런타임 타입 정보(RTTI)와 예외 처리는 호스트 코드에서만 지원되고 GPU에서 실행되는 디바이스 코드에서는 지원되지 않아.2 가장 근본적인 한계는, CUDA를 쓸 수 있는 GPU가 독점 특성상 NVIDIA 제품뿐이라는 점이야.2

왜 중요한가

AI 가속기 시장에서 NVIDIA가 오랫동안 지켜온 우위는 칩 성능만이 아니라 CUDA라는 소프트웨어 생태계에서도 나와. 대부분의 AI 프레임워크와 라이브러리가 CUDA를 표준으로 짜여 있으니, 개발자와 기업이 CUDA 위에 코드를 쌓아 올릴수록 다른 회사 GPU로 옮겨가는 비용이 커지고, 이게 NVIDIA를 잠그는 자물쇠 역할을 해. 이 자물쇠 때문에 경쟁 GPU 제조사들은 하드웨어 성능만으로 경쟁할 수 없고, CUDA와 비슷한 개발 경험을 이식성 있게 제공하는 소프트웨어 층을 따로 만들어야 해 — AMD의 ROCm이 이 문제에 대한 대표적인 대답이야.

실제 예시 — CUDA를 다른 GPU에서 돌리려는 시도들

CUDA가 NVIDIA GPU에만 묶여 있다는 한계는 CUDA 코드를 다른 회사 GPU에서 돌리려는 여러 시도를 낳았어.2 그중 ZLUDA는 AMD GPU(과거에는 인텔 GPU도)에서 near-native 성능으로 동작하는 CUDA 대체품이야.2 개발자 Andrzej Janik은 2021년에는 인텔로부터, 2022년에는 AMD로부터 각각 별도 계약을 받아 이 소프트웨어 개발을 의뢰받았어.2 하지만 두 회사 모두 명확한 비즈니스 사례가 없다는 이유로 공식 출시하지 않기로 했어.2 다만 AMD와의 계약에는 Janik이 AMD용 코드를 독자적으로 공개할 수 있게 하는 조항이 있었고, 그 덕에 그는 AMD GPU만 지원하는 새 버전을 별도로 공개할 수 있었어.2 Project Coriander, CU2CL, GPUOpen HIP, ChipStar, SCALE 같은 다른 프로젝트들도 비슷한 방식으로 CUDA 코드를 다른 GPU나 OpenCL로 옮기려 시도해왔어.2

헷갈리지 말아야 할 점

“CUDA는 하나의 프로그래밍 언어다”는 통념이 있어. CUDA C/C++라는 표현 때문에 CUDA 자체가 특정 언어라고 생각하기 쉬워. 하지만 CUDA는 C 언어로 작성됐을 뿐, C++·Fortran·Python·Julia 등 여러 언어와 함께 쓰도록 설계된 플랫폼이야.2 CUDA는 특정 언어가 아니라, 여러 언어에서 GPU에 접근하게 해주는 프로그래밍 모델과 API의 묶음이야.

이어서 읽기

  • NVIDIA — CUDA를 만들고 이 생태계를 발판으로 GPU 시장의 우위를 지키는 회사
  • ROCm — CUDA의 이식 장벽에 맞서 AMD가 내놓은 대응

남은 질문들

  • CUDA 생태계에 대한 개발자·기업의 실제 잠금 강도를 보여주는 시장 채택률·전환 비용 1차 자료는 무엇인가.
  • ZLUDA·SCALE 같은 CUDA 우회 프로젝트가 실제 상용 워크로드에서 얼마나 쓰이는지 보여주는 공식 자료는 무엇인가.

각주

  1. NVIDIA, 「CUDA C++ Programming Guide」 공식 문서 ↩︎ ↩︎2 ↩︎3 ↩︎4 ↩︎5 ↩︎6 ↩︎7 ↩︎8

  2. Wikipedia, 「CUDA」 참조 문서 ↩︎ ↩︎2 ↩︎3 ↩︎4 ↩︎5 ↩︎6 ↩︎7 ↩︎8 ↩︎9 ↩︎10 ↩︎11 ↩︎12 ↩︎13 ↩︎14 ↩︎15 ↩︎16 ↩︎17 ↩︎18