본문 바로가기

IT/Cuda

CUDA란

CUDA ("Compute Unified Device Architecture"),는 그래픽 처리장치(GPU)에서 수행하는 알고리즘을 코딩하는데 있어서 C 프로그래밍 언어를 사용할 수 있도록 하는 GPGPU 기술이다. CUDA는 엔비디아(Nvidia)에 의해서 개발되어져왔고 이 아키텍쳐의 사용하기위해선 Nvidia GPU와 특별한 스트림 처리 드라이버가 필요하다. CUDA는 G8X GPUs로 구성된 GeForce 8시리즈에서 동작할 수 있다.; Nvidia는 GeForce 8 시리즈상에 작성된 프로그램은 앞으로 개발될 Ncidia 비디오 카드에서도 프로그램 수정없이 작동할 것이라고 선언했다. CUDA는 CUDA GPUs 안의 명령셋과 대용량 병렬처리 메모리를 접근할 수 있도록 해준다.

최초의 CUDA SDK는 2007년 2월 15일에 공개되었다. CUDA의 컴파일러는 Open64에 기반을 두었다.




CUDA 메모리 구조

 

CUDA를 쓰려고하는 이유는 GPU를 사용하여 연산속도의 향상을 얻기 위함
GPU가 CPU연산보다 빠른 이유가 CPU보다 많은 ALU를 보유하고 있기 때문입니다.

CPU에서는 특정 ALU를 이용하는걸 프로그래머가 지정해주지 않지만 CUDA에서는 저 ALU하나하나를 모두 프로그래머가 제어해 주어야 합니다.
저 ALU구성은 큰 구조는 같지만, 하드웨어에 따라서 전체 ALU의 개수나 ALU에서 사용하는 GPU의 내장메모리 용량이 틀려지기 때문에 그러한 사항들을 감안해서 프로그래밍을 해주어야 속도향상이라는 결과를 얻을 수 있습니다.

 

CUDA 연산의 개념은 아래 그림과 같은 구조로 되어 있습니다.

여기서 Thread라고 되어 있는 것들이 CUDA연산에서 가장 작은 단위인 것입니다.
이 Thread들은 Block의 하위에 있고 Block들은 다시 Grid의 하위에 있습니다.
그래서 프로그래머가 연산을 하려면

'몇번Grid의 몇번Block의 몇번Thread를 사용하여 계산하겠다'

를 지정해 주어야 합니다.

 

여기서 각 Thread는 자신만의 local memory를 가지게 됩니다.
각 Thread 간에 data 공유를 위한 shared memory는 따로 있습니다.
그리고 Block들의 집합인 Grid간에 data 공유를 위한 Global memory가 있습니다.
구조는 아래와 같습니다.


memory간의 data를 이동시키는 비용이 꽤 크기 때문에 적절한 알고리즘을 작성하지 않는다면 계산하는데서 단축한 시간을 data 이동시키는데서 다 까먹을 수 있게 됩니다.
각 memory들의 속도 또한 차이가 있어서 이런 여러가지 요소를 고려하기 시작하면 복잡해지기 시작하는 겁니다.
결국 CUDA 프로그래밍의 핵심은 각 memory들의 특성을 파악해서 최대한 효율적인 알고리즘을 만드는데 있습니다.

 

아래 그림은 Grid를 이용해 계산한다는 것이 코드로는 어떻게 표현되는지를 나타냅니다.


결국 template project에서 보았던 kernel을 실행시키는 부분이 kernel에 해당하는 Grid를 실행시킨다는 것을 알 수 있습니다.



 

CUDA 메모리 구조(2)

CUDA 연산의 개념은 아래 그림과 같은 구조로 되어 있습니다. 여기서 Thread라고 되어 있는 것들이 CUDA연산에서 가장 작은 단위인 것입니다. 이 Thread들은 Block의 하위에 있고 Block들은 다시 Grid의 하�

arisu1000.tistory.com

 

'IT > Cuda' 카테고리의 다른 글

[CUDA] 프로그래밍 시작  (0) 2020.08.27
[CUDA] 프로그래밍 모델( kernel, thread )  (0) 2020.08.27
[CUDA] Visual Studio 프로젝트 만들기  (0) 2020.08.27
CUDA 설치  (0) 2020.08.27
CUDA GPU 환경 제공하는지 확인  (0) 2020.08.27