CUDA
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
CUDA는 엔비디아에서 개발한 병렬 컴퓨팅 플랫폼 및 프로그래밍 모델로, GPU를 사용하여 연산 집약적인 작업을 가속화한다. 2007년에 출시되었으며, C/C++를 확장한 CUDA C/C++를 비롯한 다양한 프로그래밍 언어를 지원한다. CUDA는 그래픽 API를 사용하는 전통적인 범용 GPU에 비해 분산 읽기, 공유 메모리, 빠른 입출력, 정수 및 비트 연산 지원 등의 장점을 제공하지만, 엔비디아 GPU에서만 사용 가능하다는 제약과 이식성, SIMD 실행 모델의 한계 등의 단점도 존재한다. 3D 그래픽 가속 렌더링, 동영상 파일 형식 변환, 암호화, 생물정보학, 기계 학습 등 다양한 분야에서 활용되며, 인텔의 OneAPI, AMD의 ROCm과 경쟁한다.
더 읽어볼만한 페이지
- GPGPU 라이브러리 - OpenCL
OpenCL은 다양한 계산 자원을 활용하여 병렬 컴퓨팅을 가능하게 하는 프레임워크로, OpenCL C/C++ 언어를 사용하여 스트림 프로세싱 커널을 작성하며, 크로노스 그룹에서 관리하는 로열티 프리 오픈 표준이다. - GPGPU 라이브러리 - ROCm
ROCm은 AMD가 개발한 개방형 소프트웨어 스택으로, GPU를 활용한 컴퓨팅을 지원하며, HIP를 통해 CUDA 코드를 사용할 수 있도록 지원하고 머신 러닝, 슈퍼컴퓨팅 등 다양한 분야에서 활용된다. - 엔비디아 소프트웨어 - 엔비디아 RTX
엔비디아 RTX는 레이 트레이싱, AI 통합, CUDA를 포함한 엔비디아의 기술로, 지포스 RTX 및 RTX 시리즈 GPU에서 텐서 코어를 활용하여 DLSS와 같은 AI 기반 기술로 이미지 품질을 향상시키고 현실감 있는 그래픽을 구현하는 데 기여한다. - 엔비디아 소프트웨어 - Cg (프로그래밍 언어)
Cg는 엔비디아와 마이크로소프트가 GPU 프로그래밍을 위해 개발한 고수준 셰이딩 언어로, GLSL, HLSL과 유사하며 CUDA 환경에도 영향을 미쳤고 현재도 활용되고 있다. - GPGPU - 인텔 Xe
인텔 Xe는 저전력부터 고성능 컴퓨팅까지 다양한 시장을 목표로 하는 인텔의 GPU 아키텍처 제품군으로, Xe-LP, Xe-HPG, Xe-HP, Xe-HPC 등의 하위 아키텍처를 가지며 외장 그래픽 카드인 인텔 아크 시리즈와 내장 그래픽, 데이터 센터용 GPU 등에 활용된다. - GPGPU - 테라스케일 (마이크로아키텍처)
테라스케일은 AMD가 개발한 GPU 마이크로아키텍처로, 셰이더 처리량 증가를 위해 통합 셰이더 모델을 사용하며, VLIW 아키텍처를 기반으로 라데온 HD 2000, 3000, 4000, 5000, 6900 시리즈에 적용되었다가 그래픽스 코어 넥스트 아키텍처로 대체되었다.
| CUDA - [IT 관련 정보]에 관한 문서 | |
|---|---|
| 일반 정보 | |
| 이름 | CUDA (Compute Unified Device Architecture) |
| 종류 | GPGPU |
| 개발사 | Nvidia |
| 출시일 | 2007년 2월 15일 |
| 최신 버전 | 12.6 |
| 최신 버전 출시일 | 2024년 8월 |
| 운영 체제 | 윈도우, 리눅스 |
| 지원 GPU | 지원되는 GPU (아래 참조) |
| 라이선스 | 사유 소프트웨어 |
| 웹사이트 | CUDA Zone |
| 기술 | |
| 사용 목적 | 병렬 컴퓨팅 플랫폼 및 프로그래밍 모델 |
2. 역사
그래픽 처리 장치(GPU)는 실시간 고해상도 3D 그래픽스 연산에 특화된 프로세서로, 2012년에는 대규모 데이터 블록을 효율적으로 처리하는 고도로 병렬화된 멀티 코어 시스템으로 발전했다. 이러한 설계는 암호화 해시 함수, 머신 러닝, 분자 역학 시뮬레이션, 물리 엔진 등 대규모 데이터 블록을 병렬 처리하는 알고리즘에서 중앙 처리 장치(CPU)보다 더 효과적이다.[8]
2000년 스탠퍼드 대학교의 이안 버크(Ian Buck)는 32개의 GeForce 카드를 사용해 8K 게이밍 장비를 만들었고, 이후 GPU에서의 범용 병렬 프로그래밍 연구로 DARPA의 지원을 받았다. 그는 2004년부터 CUDA 개발을 이끈 엔비디아에 합류했다. 젠슨 황은 CUDA를 통해 엔비디아 GPU가 과학 컴퓨팅 분야에서 널리 사용되도록 하는 목표를 세웠다.[8]
GPU는 단순 연산을 하는 많은 유닛을 가지고 있어, 이론상 최고 성능(FLOPS)은 같은 가격대의 CPU를 넘어서는 경우도 있다. 병렬성과 연산 밀도가 높은 처리에 있어서는 복잡한 구성을 가진 CPU보다 높은 성능을 낼 수 있다. 하지만 복잡한 분기 처리나 GPU와 CPU 간 데이터 전송은 병목 현상이 될 수 있어, 적용 분야를 신중하게 선택해야 한다.[150] CUDA로 작성된 프로그램을 최적화하려면, Warp나 공유 메모리 등 엔비디아 GPU 아키텍처에 대한 깊은 이해가 필요하다.[151]
2. 1. CUDA 이전의 GPGPU
CUDA 이전에는 GPGPU(General-Purpose computing on Graphics Processing Units)를 위해 여러 기술들이 사용되었다. 대표적으로는 마이크로소프트의 HLSL(High-Level Shading Language), OpenGL의 GLSL(OpenGL Shading Language), 엔비디아의 Cg(C for Graphics) 등이 있었다.이러한 기술들은 기본적으로 그래픽스 처리를 위해 설계되었기 때문에 범용 계산에 사용하기에는 여러 한계가 있었다. 예를 들어, 셰이더 프로그램을 작성해야 했고, 메모리 접근이 제한적이었으며, 병렬 처리 모델이 그래픽스 파이프라인에 종속적이었다.
2. 2. CUDA의 등장과 발전
GPU에서의 범용 병렬 프로그래밍을 위해 2004년부터 CUDA 개발을 감독해 온 엔비디아는 CUDA를 추진하면서 엔비디아 GPU가 과학 컴퓨팅을 위한 일반적인 하드웨어가 되도록 목표를 세웠고, CUDA는 2007년에 출시되었다.[8]원래 실시간 그래픽스 표시 용도, 특히 게임 그래픽스 용도로 특화된 GPU를 개발했던 것은 엔비디아(NVIDIA)와 ATI (현 AMD)이지만, 프로그래머블 셰이더의 발전에 따른 프로그래밍 가능성의 향상에 따라, 그 높은 처리 성능을 그래픽스 외에도 활용할 수 있도록 하기 위해 엔비디아가 개발한 기술이 CUDA이다. 이러한 범용 컴퓨팅을 위한 GPU 활용 기술을 GPGPU(General-Purpose computing on Graphics Processing Units)라고 부른다.
CUDA의 발표는 2006년 11월[152], CUDA 1.0의 제공 시작은 2007년 7월[153]이며, 후발 GPGPU 관련 기술에는 OpenCL(1.0 사양 공개는 2008년[154])이나 DirectCompute(DirectX 컴퓨트 셰이더. Windows 7/DirectX 11.0과 동시에 2009년에 일반 제공 시작[155]) 등이 있지만, 각각 기술 용어는 다르지만 전체적으로는 CUDA와 매우 흡사한 특징을 가지고 있다. 선발 기술인 CUDA는 2014년 시점에서 교육·연구 기관에서의 채용 사례가 많고,[156] 기계 학습 등의 분야에서 산업계에서도 채용 노력이 진행되고 있다.[157]
NVIDIA는 CUDA를 기반으로 구축된 라이브러리의 총칭을 CUDA-X라고 부른다.[169] 여기에는 다음이 포함된다.
| 분야 | 라이브러리 |
|---|---|
| 수학 | cuBLAS - BLAS 라이브러리 |
| cuFFT - 고속 푸리에 변환 | |
| CUDA Math Library | |
| cuRAND - 의사 난수 생성 | |
| cuSOLVER - LAPACK 지원 | |
| cuSPARSE - 희소 행렬 | |
| cuTENSOR - 텐서 (다차원 배열) | |
| cuDSS, AmgX - 희소 행렬의 AX = B를 푸는 라이브러리 | |
| 병렬 알고리즘 | Thrust |
| 전산 리소그래피 | cuLitho |
| 이미지와 비디오 | CV-CUDA |
| nvJPEG | |
| NVIDIA Performance Primitives | |
| NVIDIA Video Codec SDK | |
| NVIDIA Optical Flow SDK | |
| 통신 라이브러리 | NVSHMEM |
| NCCL | |
| 딥 러닝 | NVIDIA cuDNN |
| NVIDIA TensorRT | |
| NVIDIA Riva | |
| NVIDIA DeepStream SDK, NVIDIA DALI |
CUDA 플랫폼은 소프트웨어 개발자가 CUDA 가속 라이브러리, 컴파일러 지시어(예: OpenACC), 그리고 C, C++, 포트란, Python을 포함한 업계 표준 프로그래밍 언어 확장을 통해 접근할 수 있도록 지원한다.[9] C/C++ 프로그래머는 Nvidia의 LLVM 기반 C/C++ 컴파일러인 nvcc나 clang 자체를 사용할 수 있다.[9] 포트란 프로그래머는 The Portland Group의 PGI CUDA 포트란 컴파일러를 사용할 수 있으며, 파이썬 프로그래머는 cuNumeric 라이브러리를 사용하여 Nvidia GPU에서 애플리케이션을 가속화할 수 있다.
3. CUDA 프로그래밍
CUDA는 라이브러리, 컴파일러 지시어, CUDA C/C++ 및 CUDA 포트란 외에도 Khronos Group의 OpenCL,[10] 마이크로소프트의 DirectCompute, OpenGL Compute Shader 및 C++ AMP를 포함한 다른 컴퓨팅 인터페이스를 지원한다.[11] Python, Perl, Fortran, Java, Ruby, Lua, Common Lisp, Haskell, R, MATLAB, IDL, Julia 및 Mathematica를 위한 타사 래퍼도 사용할 수 있다.
CUDA는 낮은 수준의 API (CUDA '''드라이버''' API)와 더 높은 수준의 API (CUDA '''런타임''' API)를 모두 제공한다.