Compute Unified Device Architecture(CUDA)는 2007년 처음 릴리즈(release)된 이후로 그래픽을 사용하는 어플리케이션 뿐 만 아니라 일반적인 목적의 연산에서 Graphic Computing Units(GPUs)를 사용하기 위한 사실상의 표준이 되었다. 첫번째 챕터는 왜 CUDA를 사용하는지에 대해 소개하는 챕터이다. 이를 위해 High Performance Computing(HPC; 고성능 컴퓨팅)의 역사와 CUDA 프로그래밍 모델을 소개하기 위해 CPU와 GPU 구조의 근원적인 차이에 대해서도 다룬다. 챕터의 마지막엔 몇 가지 CUDA 프로그래밍 기초에 대해 소개한다.
이번챕터에서 소개할 내용을 요약하면 아래와 같다.
•
고성능 컴퓨팅(HPC)의 역사
•
CUDA로 Hello World 출력하기
•
CUDA를 사용한 벡터의 덧셈연산
•
CUDA를 사용한 에러보고
•
CUDA에서 지원하는 데이터 타입 소개
The history of high-performance computing
고성능 컴퓨팅(HPC)은 과학적인 여러 발견들과 함께 그 한계를 뛰어넘어 왔다. 특히 프로세서 아키텍쳐(processor architecture)와 디자인의 변화가 FLOP의 벽을 뛰어넘어 Mega-Floating Operation(MFLOPs)의 세상을 열었고 현재는 초당 PetaFLOP의 영역까지 가능하게 되었다.
Floating-Point Operations (FLOPs) per second : 단위 시간 당 몇번의 부동소수점 연산을 진행하는지에 대한 지표이며 모든 연산 프로세서의 성능을 측정하기 위한 단위이다. FLOP과 비교하여 MegaFLOP은 배, PetaFLOP은 배 단위를 의미한다.
Instruction-Level Parallelism(ILP) : 코드와 관련없이 동시에 실행가능한 명령의 수를 의미한다. 병렬상황에서 명령의 실행을 위해선 각 명령은 서로 독립적이어야 한다. 가령 아래와 같은 상황을 가정해보자.
Instr 1: add = inp1 + inp2
Instr 2: mult = inp1 * inp2
Instr 3: final_result = mult / add
C++
복사
이 때 mult와 add 변수는 서로 독립적인 변수기 때문에 동시에 명령을 진행할 수있다. 그러나 final_result의 경우 Instr 1과 Instr 2의 연산 결과에 종속되어 두 연산이 완료될 때 까지 실행되지 않게 된다.
현대의 모든 CPU아키텍처(심지어 GPU도)는 적게는 5개부터 시작해서 15개 이상의 명령을 한번에 처리하여 더 빠른 클락속도(clock rate)를 가지게 되었다.