본문 바로가기

Programming/Todo's CUDA

CUDA란?

01. 그래픽 카드의 성능 향상


1.1 그래픽 카드의 탄생


초기의 PC에는 별도의 그래픽 카드가 장착되지 않았지만,

1990년대 애플의 매킨토시사가 PC에 GUI환경을 갖추게 되며 Microsoft사가 뒤를 따르기 시작하였다.


높은 해상도와 빠른 그래픽 처리를 위해 그래픽 카드를 장착하기 시작하면서,

주요 연산CPU영상처리그래픽 카드 또는 내장된 별도의 그래픽 칩에서 담당하는 구조가 보편화되었다.



1.2 그래픽 카드의 발전


2000년대에 들어오면서 컴퓨터 그래픽은 영화와 게임을 중심으로 3D 영상을 중점적으로 다루게 된다.

3D영상 처리를 중심으로 벌어지는 외장형 그래픽 카드의 경쟁에서 NVIDIA 와 AMD 두 회사가 살아남게 된다.


3D처리의 특성상 대단히 많은 객체에 대한 수학적, 물리적 계산을 처리하게 되는데, 이를 원활히 처리하기 위해

그래픽 칩은 대규모 파이프 라인방식과 멀티코어로 발전하였다.


1.3 GPU(Graghic Processing Unit)


: 컴퓨터 그래픽을 전문적으로 처리하는 연산장치를 말한다.

PC에 장착된 CPU의 역할처럼 그래픽 카드에 장착된 그래픽 연산장치다.

GPU는 3D그래픽을 주로 담당하여 이와 관련된 연산을 할 때는 CPU를 대신하여 처리하여 CPU의 부담을 줄여 준다.


GPU는 CPU와 다른 위치에 있기때문에 PC를 제어하는 모든 부가적인 작업은 CPU에 맡기고 코어의 수를 비약적으로 증가시켜

병렬처리를 통한 계산을 위한 효율만을 높여왔다.








02. CPU vs GPU


2.1다른 환경에 있는 프로세서


GPU는 CPU에 비해 유연한 환경을 갖추고 있다. 

그래픽 카드는 하나의 제품안에 보드와 메모리, GPU를 갖추고 있어 내부의 규격을 자유롭게 변경할 수 있다.


이러한 환경을 기반으로 GPU는 코어를 대량으로 증가시키고 빠른 메모리를 채용하여 GPU롸 메모리 간 데이터 전송속도 격차를 줄였다.

이것은 대규모 데이터를 병렬처리하는 3D그래픽에 좋은 해결 방법이 되었다.



2.2트랜지스터 자원의 배분




ALU - 덧셈, 뺄셈, 곱셈과 같이 실제로 데이터를 계산하는 연산장치다.


Control - 연산 명령의 실행 순서와 조건 분기, 스케줄링과 같은 제어를 담당한다.


Cache 와 DRAM - 처리하고자 하는 데이터를 가져오고 출력하기 위해 사용된다.



CPU는 연산 명령의 순서 제어를 위한 컨트롤과 데이터 캐시를 위해 많은 부분을 배분했다. 

이에 반해 GPU는 3D 그래픽 처리와 같은 대량의 병렬 연산을 처리하기 위해 많은 부분을 ALU에 배분하고 있다.

이것은 단순하지만 강력한 계산 능력을 갖추게 된다.


                 






03. GPGPU(General Purpose Graphics Processing Unit)


-강력해진 GPU의 성능을 그래픽 처리뿐만 아니라 일반적인 데이터를 처리하는 데도 사용하는 것을 의미한다.


3D 그래픽에서 픽셀 좌표계, 렌더링, 비디오 인코딩, 화상 스케일링 같은 처리는 수많은 데이터를 멀티코어 또는 가속기를 이용하여

빠르게 계산한다는 점에서 범용적인 병렬처리와 유사하다. 이런 유사성을 이용하여 강력해진 GPU 성능을 일반적인 신호 처리, 물리 시뮬레이션,

재무 예측, 생물학적 계산 같은 데이터 병렬처리에 이용하고자 하는 것이 GPGPU이다.


하지만, 그래픽을 위한 전용 API함수와 그래픽 카드의 한계 때문에 그래픽 카드를 일반적인 용도로 사용하기에는 무리가 있다.

기존에 제공되고 있던 그래픽 API함수는 그래픽 엔진을 다루는 프로그래머가 주로 사용하던 것으로, 일반적인 프로그래머나 초보자가 사용하기에는 많은 어려움이 있었다. 또 다른 어려움은 GPU의 연산 능력과 비교하면 DRAM 메모리 대역폭의 한계로 병목 현상이 발생하여 유연한 프로그램을 작성할 수 없었다는 점이다.


이러한 한계를 극복하고 효율적으로 GPGPU를 지원하기 위해 나온 것이 CUDA이다.







04. CUDA


CUDA는 그래픽 카드를 이용한 GPGPU의 통합 개발 환경 제공을 목적으로 한다.


NVIDIA사에서 GPGPU에 대한 흐름을 먼저 인식하고 그래픽 카드를 범용적인 용도로 사용할 때 발생하는 어려움을 해결하기 위한 노력을 시작하였다. 이전의 그래픽 카드는 3D처리를 위해 다양한 기능이 추가되었지만 모두 그래픽 처리를 위한 것으로 범용적인 용도로 쓰이는 것들은 아니었다.


이런 문제를 해결하기 위해 NVIDIA사는 기존의 GeForce 시리즈를 그래픽 전용처리를 위한 구조에서 유연성을 향상시켜 범용적인 프로그램을 처리할 수 있도록 변경하였다. 그리고 GPU를 이용한 범용적인 프로그램을 개발할 수 있도록 '프로그램 모델', '프로그램 언어', '컴파일러', '라이브러리', '디버거', '프로파일러'를 제공하는 통합 환경을 구축하였다.


2006년 11월 NVIDIA사는 다목적 프로그램을 위한 그래픽 카드 GeForce8000시리즈를 출시하였고, 2007년 2월에 통합 개발환경 

'CUDA(Compute Unified Device Architecture)'를 발표하였다.







05. CUDA의 장점


-높은 연산 처리능력

-병렬 프로그램의 확장성

-저렴한 가격

-편리한 설치



CUDA의 연산 능력


- 1TFLOP/s 기준으로 10년전 슈퍼컴퓨터와 동등한 수준, 인텔 i7 CPU를 10개 합쳐야 나오는 성능이다



병렬 프로그램의 확장성


-잘 설계된 CUDA 프로그램은  GPU의 성능에 비례하여 연산 능력을 발휘한다. 대규모 데이터를 멀티스레드로 실행하여 처리하기 때문에 그래픽 카드가 발전하여 코어 수가 증가하면 자동으로 연산에 필요한 시간이 줄어들게 된다.


저렴한 가격


-같은 성능을 내도록 단순 계산 하여도 인텔 i7 CPU를 장착한 PC 10대를 구성하는 것보다 고성능 그래픽카드 하나를 장착하는 것이 더욱 효율적이다. 또한 CPU만으로는 이런 시스템을 구축할 수 없고 메인보드와 메모리 같은 추가 부품도 필요하지만, 만일 GPU로 더 좋은 성능을 구축할 필요가 있다면 같은 그래픽 카드를 하나 더 장착하면 되는것이다.



 











'Programming > Todo's CUDA' 카테고리의 다른 글

CUDA 프로그램 준비 - CUDA C언어  (0) 2019.01.31
CUDA 프로그램 준비 - 설치  (0) 2019.01.31
CUDA의 기본 - 3(Architecture)  (0) 2019.01.31
CUDA의 기본 - 2  (0) 2019.01.30
CUDA의 기본 - 1  (0) 2019.01.29