상위 질문
타임라인
채팅
관점
CUDA
GPGPU 기술 위키백과, 무료 백과사전
Remove ads
컴퓨팅에서 CUDA (Compute Unified Device Architecture)는 그래픽 처리 장치 (GPU)의 특정 유형을 사용하여 가속화된 범용 처리를 가능하게 하는 독점적인[1] 병렬 컴퓨팅 플랫폼 및 API이다. 이러한 접근 방식을 GPU 기반 범용 컴퓨팅이라고 한다. CUDA는 엔비디아가 2006년에 만들었다.[2] 처음 소개될 때 그 이름은 Compute Unified Device Architecture의 약어였지만,[3] 엔비디아는 나중에 약어의 일반적인 사용을 중단하고 현재는 거의 확장하지 않는다.[4]
CUDA는 GPU의 가상 명령어 집합 및 병렬 컴퓨팅 요소에 직접 접근하여 컴퓨트 커널을 실행할 수 있도록 하는 소프트웨어 계층이다.[5] 드라이버 및 런타임 커널 외에도 CUDA 플랫폼에는 프로그래머가 애플리케이션을 가속화하는 데 도움이 되는 컴파일러, 라이브러리 및 개발자 도구가 포함되어 있다.
CUDA는 C, C++, 포트란, 파이썬, 줄리아와 같은 프로그래밍 언어와 함께 작동하도록 설계되었다. 이러한 접근성은 Direct3D 및 OpenGL과 같은 이전 API가 고급 그래픽 프로그래밍 기술을 요구했던 것과 대조적으로 병렬 프로그래밍 전문가가 GPU 리소스를 더 쉽게 사용할 수 있도록 한다.[6] CUDA 기반 GPU는 OpenMP, OpenACC 및 OpenCL과 같은 프로그래밍 프레임워크도 지원한다.[7][5]
Remove ads
배경
그래픽 처리 장치 (GPU)는 전문화된 컴퓨터 프로세서로서 실시간 고해상도 3차원 그래픽스의 컴퓨팅 집약적인 작업 요구 사항을 해결한다. 2012년까지 GPU는 대규모 데이터 블록을 효율적으로 조작할 수 있는 고도로 병렬적인 멀티 코어 시스템으로 발전했다. 이러한 설계는 대규모 데이터 블록 처리가 병렬로 수행되는 상황에서 일반적인 중앙 처리 장치 (CPU)보다 알고리즘에 더 효과적이다. 예를 들어 다음과 같은 상황에서 그렇다.
이안 벅은 2000년 스탠포드에서 32개의 지포스 카드를 사용하여 8K 게임 장비를 만들었고, 그 후 DARPA 보조금을 받아 GPU에서 범용 병렬 프로그래밍을 수행했다. 그 후 그는 엔비디아에 합류하여 2004년부터 CUDA 개발을 감독하고 있다. CUDA를 추진하면서 젠슨 황은 엔비디아 GPU가 과학 컴퓨팅을 위한 일반 하드웨어가 되는 것을 목표로 했다. CUDA는 2007년에 출시되었다. 2015년경 CUDA의 초점은 신경망으로 바뀌었다.[8]
Remove ads
온톨로지
다음 표는 CUDA 프레임워크의 온톨로지에 대한 비정확한 설명을 제공한다.
Remove ads
프로그래밍 기능
요약
관점
- 메인 메모리에서 GPU 메모리로 데이터 복사
- CPU가 GPU 컴퓨트 커널 시작
- GPU의 CUDA 코어가 커널을 병렬로 실행
- GPU 메모리에서 메인 메모리로 결과 데이터 복사
CUDA 플랫폼은 CUDA 가속 라이브러리, OpenACC와 같은 컴파일러 지시문, 그리고 C, C++, 포트란, 파이썬을 포함한 산업 표준 프로그래밍 언어의 확장을 통해 소프트웨어 개발자에게 접근 가능하다. C/C++ 프로그래머는 엔비디아의 LLVM 기반 C/C++ 컴파일러인 nvcc 또는 clang 자체를 사용하여 PTX로 컴파일된 'CUDA C/C++'를 사용할 수 있다.[9] 포트란 프로그래머는 The Portland Group의 PGI CUDA 포트란 컴파일러를 사용하여 'CUDA 포트란'을 사용할 수 있다. 파이썬 프로그래머는 cuNumeric 라이브러리를 사용하여 엔비디아 GPU에서 애플리케이션을 가속화할 수 있다.
라이브러리, 컴파일러 지시문, CUDA C/C++ 및 CUDA 포트란 외에도 CUDA 플랫폼은 크로노스 그룹의 OpenCL,[10] 마이크로소프트의 다이렉트컴퓨트, OpenGL 컴퓨트 셰이더 및 C++ AMP를 포함한 다른 컴퓨팅 인터페이스를 지원한다.[11] 파이썬, 펄, 포트란, 자바, 루비, 루아, 커먼 리스프, 하스켈, R, 매트랩, IDL, 줄리아에 대한 타사 래퍼도 사용할 수 있으며, 매스매티카에는 네이티브 지원이 제공된다.
비디오 게임 산업에서 GPU는 그래픽 렌더링 및 게임 물리 계산 (파편, 연기, 불, 유체와 같은 물리적 효과)에 사용되며, PhysX 및 불릿이 그 예시이다. CUDA는 계산생물학, 암호학 및 기타 분야에서 비그래픽 애플리케이션을 크게 가속화하는 데 사용되기도 했다.[12][13][14][15][16]
CUDA는 낮은 수준의 API (CUDA 드라이버 API, 비단일 소스)와 높은 수준의 API (CUDA 런타임 API, 단일 소스)를 모두 제공한다. 초기 CUDA SDK는 2007년 2월 15일에 마이크로소프트 윈도우 및 리눅스용으로 공개되었다. 맥 OS X 지원은 나중에 버전 2.0에 추가되었으며,[17] 이는 2008년 2월 14일에 출시된 베타 버전을 대체한다.[18] CUDA는 G8x 시리즈 이후의 모든 엔비디아 GPU, 즉 지포스, 쿼드로 및 엔비디아 테슬라 라인과 함께 작동한다. CUDA는 대부분의 표준 운영 체제와 호환된다.
CUDA 8.0에는 다음 라이브러리가 포함된다 (컴파일 및 런타임용, 알파벳 순):
- cuBLAS – CUDA 기본 선형 대수 서브루틴 라이브러리
- CUDART – CUDA 런타임 라이브러리
- cuFFT – CUDA 고속 푸리에 변환 라이브러리
- cuRAND – CUDA 무작위 숫자 생성 라이브러리
- cuSOLVER – CUDA 기반 조밀 및 희소 직접 솔버 컬렉션
- cuSPARSE – CUDA 희소 행렬 라이브러리
- NPP – 엔비디아 성능 프리미티브 라이브러리
- nvGRAPH – 엔비디아 그래프 분석 라이브러리
- NVML – 엔비디아 관리 라이브러리
- NVRTC – CUDA C++용 엔비디아 런타임 컴파일 라이브러리
CUDA 8.0에는 다음 다른 소프트웨어 구성 요소가 포함된다:
- nView – 엔비디아 nView 데스크톱 관리 소프트웨어
- NVWMI – 엔비디아 엔터프라이즈 관리 툴킷
- GameWorks PhysX – 멀티 플랫폼 게임 물리 엔진
CUDA 9.0–9.2에는 다음 다른 구성 요소가 포함된다:
- CUTLASS 1.0 – 사용자 정의 선형 대수 알고리즘
- NVIDIA Video Decoder는 CUDA 9.2에서 더 이상 사용되지 않으며, 이제 NVIDIA Video Codec SDK에서 사용할 수 있다.
CUDA 10에는 다음 다른 구성 요소가 포함된다:
- nvJPEG – 하이브리드 (CPU 및 GPU) JPEG 처리
CUDA 11.0–11.8에는 다음 다른 구성 요소가 포함된다:[19][20][21][22]
- CUB은 새로 지원되는 C++ 라이브러리 중 하나이다.
- MIG 멀티 인스턴스 GPU 지원
- nvJPEG2000 – JPEG 2000 인코더 및 디코더
Remove ads
장점
CUDA는 그래픽 API를 사용하는 기존 GPU 기반 범용 컴퓨팅에 비해 몇 가지 장점이 있다.
- 분산 읽기 – 코드가 메모리의 임의 주소에서 읽을 수 있다.
- 통합 가상 메모리 (CUDA 4.0 이상)
- 통합 메모리 (CUDA 6.0 이상)
- 공유 메모리 – CUDA는 스레드 간에 공유될 수 있는 빠른 공유 메모리 영역을 노출한다. 이것은 사용자 관리 캐시로 사용될 수 있으며, 텍스처 조회로 가능한 것보다 높은 대역폭을 가능하게 한다.[23]
- GPU로의 더 빠른 다운로드 및 리드백
- 정수 및 비트 연산에 대한 완전한 지원 (정수 텍스처 조회 포함)
한계
- 호스트 컴퓨터든 GPU 장치든, 모든 CUDA 소스 코드는 이제 C++ 구문 규칙에 따라 처리된다.[24] 이는 항상 그런 것은 아니었다. 이전 버전의 CUDA는 C 구문 규칙을 기반으로 했다.[25] C 코드를 C++ 컴파일러로 컴파일하는 일반적인 경우와 마찬가지로, 오래된 C 스타일 CUDA 소스 코드가 컴파일에 실패하거나 원래 의도와 다르게 동작할 수 있다.
- OpenGL과 같은 렌더링 언어와의 상호 운용성은 단방향이며, OpenGL은 등록된 CUDA 메모리에 접근할 수 있지만 CUDA는 OpenGL 메모리에 접근할 수 없다.
- 호스트와 장치 메모리 간의 복사는 시스템 버스 대역폭 및 지연 시간으로 인해 성능 저하를 초래할 수 있다 (이는 GPU의 DMA 엔진이 처리하는 비동기 메모리 전송으로 부분적으로 완화될 수 있다).
- 스레드는 최상의 성능을 위해 최소 32개 그룹으로 실행되어야 하며, 총 스레드 수는 수천 개에 달해야 한다. 프로그램 코드의 분기는 32개 스레드 각각이 동일한 실행 경로를 따르는 한 성능에 큰 영향을 미치지 않는다. SIMD 실행 모델은 본질적으로 발산하는 작업 (예: 광선 추적 중 공간 분할 데이터 구조를 순회하는 경우)에 상당한 제약이 된다.
- 최신 개정판에는 에뮬레이션 또는 대체 기능이 제공되지 않는다.
- 유효한 C++ 코드도 컴파일러가 대상 GPU 장치 제한에 대한 최적화를 접근하는 방식 때문에 때때로 플래그가 지정되어 컴파일을 방해할 수 있다.
- C++ 런타임 타입 정보 (RTTI) 및 C++ 스타일 예외 처리는 장치 코드에서는 지원되지 않고 호스트 코드에서만 지원된다.
- 1세대 CUDA 컴퓨팅 기능 1.x 장치에서 단정밀도의 비정규수는 지원되지 않고 대신 0으로 플러시되며, 나눗셈 및 제곱근 연산의 정밀도는 IEEE 754 호환 단정밀도 수학보다 약간 낮다. 컴퓨팅 기능 2.0 이상을 지원하는 장치는 비정규수를 지원하며, 나눗셈 및 제곱근 연산은 기본적으로 IEEE 754 호환이다. 그러나 사용자는 컴파일러 플래그를 설정하여 정확한 나눗셈 및 정확한 제곱근을 비활성화하고 비정규수를 0으로 플러시함으로써 원하는 경우 이전의 더 빠른 게임 등급의 컴퓨팅 기능 1.x 장치 수학을 얻을 수 있다.[26]
- OpenCL과 달리, CUDA 지원 GPU는 엔비디아가 독점적이기 때문에 엔비디아에서만 사용할 수 있다.[27][1] 다른 GPU에서 CUDA를 구현하려는 시도에는 다음이 포함된다:
- 프로젝트 코리앤더: CUDA C++11 소스를 OpenCL 1.2 C로 변환한다. 텐서플로를 실행하기 위한 CUDA-on-CL의 포크이다.[28][29][30]
- CU2CL: CUDA 3.2 C++를 OpenCL C로 변환한다.[31]
- GPUOpen HIP: AMD 및 엔비디아 GPU용으로 CUDA 및 ROCm 위에 있는 얇은 추상화 계층이다. CUDA C++ 소스를 가져오기 위한 변환 도구를 가지고 있다. CUDA 4.0과 C++11 및 float16을 지원한다.
- ZLUDA는 AMD GPU 및 이전 인텔 GPU에서 거의 네이티브 성능으로 CUDA를 드롭인 대체하는 프로그램이다.[32] 개발자 안제이 야니크는 2021년과 2022년에 각각 인텔과 AMD로부터 소프트웨어 개발 계약을 체결했다. 그러나 양사 모두 비즈니스 사용 사례 부족으로 공식 출시를 결정하지 않았다. AMD의 계약에는 야니크가 AMD용 코드를 독립적으로 출시할 수 있도록 허용하는 조항이 포함되어 있어, 그가 AMD GPU만 지원하는 새 버전을 출시할 수 있게 되었다.[33]
- chipStar는 고급 OpenCL 3.0 또는 Level Zero 플랫폼에서 CUDA/HIP 프로그램을 컴파일하고 실행할 수 있다.[34]
Remove ads
예시
요약
관점
다음 C++ 예제 코드는 이미지에서 GPU의 배열로 텍스처를 로드한다.
texture<float, 2, cudaReadModeElementType> tex;
void foo()
{
cudaArray* cu_array;
// Allocate array
cudaChannelFormatDesc description = cudaCreateChannelDesc<float>();
cudaMallocArray(&cu_array, &description, width, height);
// Copy image data to array
cudaMemcpyToArray(cu_array, image, width*height*sizeof(float), cudaMemcpyHostToDevice);
// Set texture parameters (default)
tex.addressMode[0] = cudaAddressModeClamp;
tex.addressMode[1] = cudaAddressModeClamp;
tex.filterMode = cudaFilterModePoint;
tex.normalized = false; // do not normalize coordinates
// Bind the array to the texture
cudaBindTextureToArray(tex, cu_array);
// Run kernel
dim3 blockDim(16, 16, 1);
dim3 gridDim((width + blockDim.x - 1)/ blockDim.x, (height + blockDim.y - 1) / blockDim.y, 1);
kernel<<< gridDim, blockDim, 0 >>>(d_data, height, width);
// Unbind the array from the texture
cudaUnbindTexture(tex);
} //end foo()
__global__ void kernel(float* odata, int height, int width)
{
unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;
if (x < width && y < height) {
float c = tex2D(tex, x, y);
odata[y*width+x] = c;
}
}
아래는 GPU에서 두 배열의 곱을 계산하는 파이썬 예시이다. 비공식 파이썬 언어 바인딩은 PyCUDA에서 얻을 수 있다.[35]
import pycuda.compiler as comp
import pycuda.driver as drv
import numpy
import pycuda.autoinit
mod = comp.SourceModule(
"""
__global__ void multiply_them(float *dest, float *a, float *b)
{
const int i = threadIdx.x;
dest[i] = a[i] * b[i];
}
"""
)
multiply_them = mod.get_function("multiply_them")
a = numpy.random.randn(400).astype(numpy.float32)
b = numpy.random.randn(400).astype(numpy.float32)
dest = numpy.zeros_like(a)
multiply_them(drv.Out(dest), drv.In(a), drv.In(b), block=(400, 1, 1))
print(dest - a * b)
행렬 곱셈 연산을 단순화하는 추가 파이썬 바인딩은 pycublas 프로그램에서 찾을 수 있다.[36]
import numpy
from pycublas import CUBLASMatrix
A = CUBLASMatrix(numpy.mat([[1, 2, 3], [4, 5, 6]], numpy.float32))
B = CUBLASMatrix(numpy.mat([[2, 3], [4, 5], [6, 7]], numpy.float32))
C = A * B
print(C.np_mat())
반면 CuPy는 NumPy를 직접 대체한다.[37]
import cupy
a = cupy.random.randn(400)
b = cupy.random.randn(400)
dest = cupy.zeros_like(a)
print(dest - a * b)
Remove ads
지원 GPU
요약
관점
CUDA SDK 버전 및 마이크로아키텍처 (코드명 기준)별 지원 CUDA 컴퓨팅 기능 버전:
참고: CUDA SDK 10.2는 macOS의 최신 공식 릴리스이며, 이후 릴리스에서는 macOS 지원이 제공되지 않는다.
버전별 CUDA 컴퓨팅 기능, 관련 GPU 반도체 및 GPU 카드 모델 (다양한 애플리케이션 영역별로 구분):
* – OEM 전용 제품
Remove ads
버전 기능 및 사양
요약
관점
데이터 유형
부동소수점 유형
버전 지원
참고: 누락된 줄이나 빈 항목은 해당 항목에 대한 정보 부족을 나타낸다.[58]
텐서 코어
참고: 누락된 줄이나 빈 항목은 해당 항목에 대한 정보 부족을 나타낸다.[62][63] [64] [65] [66] [67]
기술 사양
엔비디아 CUDA C++ 프로그래밍 가이드에서 더 많은 정보를 읽을 수 있다.[85]
멀티프로세서 아키텍처
Remove ads
CUDA 아키텍처 사용례
- 3D 그래픽의 가속 렌더링
- 비디오 파일 형식의 가속 상호 변환
- 가속 암호화, 복호화 및 압축
- 생물정보학, 예: NGS DNA 염기서열 분석 BarraCUDA[113]
- 단백질의 원시 형태 예측과 같은 분산 계산
- 의료 분석 시뮬레이션, 예를 들어 CT 및 MRI 스캔 이미지를 기반으로 한 가상 현실
- 물리 시뮬레이션,[114] 특히 유체동역학
- 기계 학습 문제에서의 신경망 훈련
- 대규모 언어 모델 추론
- 얼굴 인식
- SETI@home 및 BOINC 소프트웨어를 사용하는 기타 프로젝트와 같은 자원 컴퓨팅 프로젝트
- 분자동역학
- 암호화폐 채굴
- SfM 소프트웨어
경쟁사와의 비교
CUDA는 다른 GPU 컴퓨팅 스택인 인텔 OneAPI 및 AMD ROCm과 경쟁한다.
엔비디아의 CUDA는 클로즈드 소스인 반면, 인텔의 OneAPI와 AMD의 ROCm은 오픈 소스이다.
인텔 OneAPI
oneAPI는 여러 하드웨어 아키텍처를 위한 소프트웨어 개발을 지원하기 위해 만들어진 오픈 표준 기반의 이니셔티브이다.[115] oneAPI 라이브러리는 특별 관심 그룹에서 공개적으로 논의되는 오픈 사양을 구현해야 하며, 모든 개발자 또는 조직이 자신만의 oneAPI 라이브러리 버전을 구현할 가능성을 제공한다.[116][117]
원래 인텔에서 만들었으며, 다른 하드웨어 채택자로는 후지쓰와 화웨이가 있다.
UXL (Unified Acceleration Foundation)
UXL (Unified Acceleration Foundation)은 엔비디아의 CUDA에 대한 오픈 대안을 제공하는 것을 목표로 워킹 그룹 및 특별 관심 그룹 (SIG)을 통해 새로운 오픈 표준 가속기 소프트웨어 생태계, 관련 오픈 표준 및 사양 프로젝트를 지속적으로 개발하기 위해 노력하는 새로운 기술 컨소시엄이다. 주요 참여 기업은 인텔, 구글, ARM, 퀄컴, 삼성, 이매지네이션, 그리고 VMware이다.[118]
AMD ROCm
ROCm[119]은 AMD (Advanced Micro Devices)의 그래픽 처리 장치 (GPU) 프로그래밍을 위한 오픈 소스 소프트웨어 스택이다.
Remove ads
같이 보기
각주
외부 링크
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads