상위 질문
타임라인
채팅
관점
CUDA
GPGPU 기술 위키백과, 무료 백과사전
Remove ads
CUDA("Compute Unified Device Architecture", 쿠다)는 그래픽 처리 장치(GPU)에서 수행하는 (병렬 처리) 알고리즘을 C 프로그래밍 언어를 비롯한 산업 표준 언어를 사용하여 작성할 수 있도록 하는 GPGPU 기술이다. CUDA는 엔비디아가 개발해오고 있으며 이 아키텍처를 사용하려면 엔비디아 GPU와 특별한 스트림 처리 드라이버가 필요하다. CUDA는 G8X GPU로 구성된 지포스 8 시리즈급 이상에서 동작한다. CUDA 플랫폼은 컴퓨터 커널의 실행을 위해 GPU의 가상 명령 집합과 병렬 연산 요소들을 직접 접근할 수 있는 소프트웨어 계층이다.[1]
Remove ads
1. 메인 메모리를 GPU 메모리로 복사
2. CPU가 GPU에 프로세스를 지시함
3. GPU가 각 코어에 병렬 수행
4. GPU 메모리로부터의 결과물을 메인 메모리에 복사
개발자는 패스스케일 오픈64 C 컴파일러로 컴파일 된 '쿠다를 위한 C' (C언어를 엔비디아가 확장한 것)를 사용하여 GPU 상에서 실행시킬 알고리즘을 작성할 수 있다. 쿠다 구조는 일련의 계산 인터페이스를 지원하며 이에는 OpenCL, DirectX Compute가 포함된다. C 언어가 아닌 다른 프로그래밍언어에서의 개발을 위한 래퍼(Wrapper)도 있는데, 현재 파이썬, 펄, 포트란, 자바와 매트랩 등을 위한 것들이 있다. 이러한 접근성은 병렬 프로그래밍 전문가들이 GPU 리소스를 쉽게 이용할 수 있게 해주며, 이는 그래픽스 프로그래밍의 고급 기술을 요구하였던 Direct3D와 OpenGL과 같은 이전 API 솔루션들과 대비된다. 또, CUDA는 OpenACC와 OpenCL과 같은 프로그래밍 프레임워크를 지원한다.[1]
최신 드라이버는 모두 필요한 쿠다 콤포넌트를 담고 있다. 쿠다는 모든 엔비디아 GPU (G8X 시리즈 이후)를 지원하며 이 대상에는 지포스, 쿼드로, 테슬라 제품군이 포함된다. 엔비디아는 지포스 8 시리즈를 위해 개발된 프로그램들이 수정 없이 모든 미래의 엔비디아 비디오 카드에서 실행될 것이라고 선언하였다.
쿠다를 통해 개발자들은 쿠다 GPU 안 병렬 계산 요소 고유의 명령어 집합과 메모리에 접근할 수 있다. 쿠다를 사용하여 최신 엔비디아 GPU를 효과적으로 개방적으로 사용할 수 있다. 그러나 CPU와는 달리 GPU는 병렬 다수 코어 구조를 가지고 있고, 각 코어는 수천 스레드를 동시에 실행시킬 수 있다. 응용 프로그램이 수행하는 작업(계산)이 이러한 병렬처리연산에 적합할 경우, GPU를 이용함으로써 커다란 성능 향상을 기대할 수 있다.
컴퓨터 게임 업계에서는 그래픽 랜더링에 덧붙여, 그래픽 카드의 게임 물리 계산 (파편, 연기, 불, 유체 등 물리 효과)에 사용되며, 예로는 PhysX와 불렛이 있다. 쿠다는 그래픽이 아닌 응용 프로그램, 즉, 계산 생물학, 암호학, 그리고 다른 분야에서 10배 또는 그 이상의 속도 혜택을 가져왔다. 이 한 예는 BOINC 분산 계산 클라이언트이다.
쿠다는 저수준 API와 고수준 API 모두를 제공한다. 최초의 CUDA SDK는 2007년 2월 15일에 공개되었으며 마이크로소프트 윈도우와 리눅스를 지원했다. OS X 지원은 2.0 버전에 추가되었다.
Remove ads
이점
쿠다가 그래픽 API를 사용하는 전통적인 범용 GPU에 비해 가지는 몇 가지 장점은 다음과 같다.
- 흩뿌린 읽기 - 코드가 메모리의 임의 위치에서 데이터를 읽을 수 있다.
- 공유 메모리 - 쿠다는 고속 공유 메모리 지역 (16 또는 48KB 크기) 을 드러내어 스레드 간에 나눌 수 있게 해 준다. 이는 사용자 관리 캐시로 사용될 수 있는데, 텍스처 룩업을 이용하는 경우 보다 더 빠른 대역폭이 가능해진다.
- 디바이스 상의 읽기, 쓰기가 호스트보다 더 빠르다.
- 정수와 비트 단위 연산을 충분히 지원한다. 정수 텍스처 룩업이 포함된다.
제한
- 재귀호출, 함수 포인터가 없는 C 언어의 하부 집합을 확장하여 사용한다. 그러나 한 개의 처리 장치가 여러 개의 쪼개진 메모리 공간에 대하여 작업하여야 하는 점이 다른 C 언어 실행 환경과 다른 점이다.
- 텍스처 랜더링은 지원 되지 않는다.
- 배정도에 관해서는 IEEE 754 표준과 다르지 않다. 단정도에서는 비정규 값과 신호 NaN이 지원되지 않고, IEEE 반올림 모드 가운데서는 두 가지만 지원하며, 이도 명령어에 따라서 지원되는 것으로 제어 단어(Control word)에서 지원 되는 것은 아니다.(이것이 제한점인지는 논란의 대상이 될 수 있다) 그리고 나눗셈과 제곱근의 정밀도가 단정도에 비해 조금 낮다.
- CPU와 GPU 사이의 버스 대역폭과 시간 지연에서 병목이 발생할 수 있다.
- 스레드가 최소한 32개씩 모여서 실행되어야 최선의 성능 향상을 얻을 수 있으며, 스레드 수의 합이 수천 개가 되어야 한다. 프로그램 코드에서의 분기는, 각각의 32 스레드가 같은 실행 경로를 따른다면, 성능에 큰 지장을 주지 않는다. SIMD 실행 모델은 어떠한 내재적으로 분기하는 임무에게는 심각한 제한이 된다. (예를 들어, 광선 추적 가속 자료 구조)
- 쿠다 기반 GPU는 엔비디아에서만 나온다.
Remove ads
지원 GPU
요약
관점
CUDA 수준의 지원 GPU 및 카드이다. 엔비디아 웹사이트도 참고할 것:
'*' - OEM 전용 제품
Remove ads
언어 결합
- 커먼 리스프 - cl-cuda
- 포트란 - FORTRAN CUDA 보관됨 2012-04-10 - 웨이백 머신, PGI CUDA Fortran Compiler
- F# - Alea.CUDA
- 하스켈 - Data.Array.Accelerate
- IDL - GPULib 보관됨 2012-11-07 - 웨이백 머신
- 자바 - jCUDA, JCuda, JCublas, JCufft, CUDA4J
- 루아 - KappaCUDA
- 매스매티카 - CUDALink
- MATLAB - 병렬 컴퓨팅 툴박스, MATLAB 분산 컴퓨팅 서버,[2] 재킷과 같은 타사 패키지.
- .NET - CUDA.NET, Managed CUDA, CUDAfy.NET .NET 커널 및 호스트 코드, CURAND, CUBLAS, CUFFT
- 펄 - KappaCUDA, CUDA::Minimal
- 파이썬 - Numba, NumbaPro, PyCUDA, KappaCUDA, Theano 보관됨 2020-11-08 - 웨이백 머신
- 루비 - KappaCUDA
- R - gputools
Remove ads
예제
요약
관점
C++
이 예제는 텍스처 하나를 어떤 이미지로부터 GPU상의 행렬로 읽어들인다.
cudaArray* cu_array;
texture<float, 2> tex;
// 행렬 할당
cudaMallocArray(&cu_array, cudaCreateChannelDesc<float>(), width, height);
// 이미지 데이터를 행렬로 복사
cudaMemcpy(cu_array, image, width*height, cudaMemcpyHostToDevice);
// 행렬을 텍스처에 연결한다.
cudaBindTexture(tex, cu_array);
// 커널을 실행한다
dim3 blockDim(16, 16, 1);
dim3 gridDim(width / blockDim.x, height / blockDim.y, 1);
kernel<<< gridDim, blockDim, 0 >>>(d_odata, width, height);
cudaUnbindTexture(tex);
__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;
float c = texfetch(tex, x, y);
odata[y*width+x] = c;
}
파이썬
파이선 언어의 바인딩은 PyCUDA에서 구할 수 있다.
아래 예제는 두 배열의 곱을 GPU 상에서 계산한다.
import pycuda.driver as drv
import numpy
import pycuda.autoinit
mod = drv.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
행렬 곱셈을 단순화하는 추가 파이선 바인딩을 사용한 예제이다.
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()
Remove ads
같이 보기
각주
외부 링크
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads