달공이와 임베디드

[CUDA] CUDA 본문

CUDA 프로그래밍

[CUDA] CUDA

하일리99 2018. 9. 19. 12:38


※ 주의:

본 글은 개인 공부를 위해 작성되었으므로, 오류가 있을 수 있습니다.

오류를 발견하시면, 댓글로 남겨주시면 감사하겠습니다.




CUDA : Compute Unified Device Architecture


CUDA ("Compute Unified Device Architecture", 쿠다)는 그래픽 처리 장치(GPU)에서 수행하는 (병렬 처리) 알고리즘을 C 프로그래밍 언어를 비롯한 산업 표준 언어를 사용하여 작성할 수 있도록 하는 GPGPU 기술이다. CUDA는 엔비디아가 개발해오고 있으며 이 아키텍처를 사용하려면 엔비디아 GPU와 특별한 스트림 처리 드라이버가 필요하다. CUDA는 G8X GPU로 구성된 지포스 8 시리즈급 이상에서 동작한다. CUDA 플랫폼은 컴퓨터 커널의 실행을 위해 GPU의 가상 령어 집합과 병렬 연산 요소들을 직접 접근할 수 있는 소프트웨어 계층이다. (wiki)


쉽게 말해서, CUDA는 엔비디아 GPU를 사용할 때, 필요한 라이브러리라고 할 수 있다. 


CPU가 동작하기 위해서는 명령어를 받아들여야 한다. 예를들어, CPU가 1번 레지스터에 값 5를 넣고, 2번 레지스터에 값 3을 넣고 두 값을 더하는 연산을 CPU가 수행하도록록 하기 위해서는 ①mov r1, #5 ②mov r2, #3 ③add r1, r2 명령어를 순차적으로 받아야 한다. 이러한 명령어는 CPU 설계단계에서 정의되어 있고 이를 명령어 집합(Instruction Set)이라고 부른다.


GPU는 병렬처리를 하기 위해서 고안된 머신이라고 할 수 있다. CPU와 마찬가지로 이러한 역할을 수행하기 위해서는 특정 명령어를 받아야 한다. 그러나, 프로그래머가 개별 명령어 레벨에서 프로그래밍을 하는 것은 불편하므로, 엔비디아가 프로그래머의 편의를 위해, 라이브러리 형태로 제공해 주는 것이다. 




CUDA 동작방식


CUDA의 동작방식은 Heterogeneous computing과 유사하다. CPU와 GPU 각 머신에서 자신이 잘하는 일을 하고, 각 처리된 데이터를 넘겨준다. 일반적으로 CUDA는 다음의 동작방식을 따른다. 

0. Processing 할 데이터 공간을 main memory에 생성하고, 초기화해준다.
1. main memory에 할당된 값들을 GPU memory로 복사한다.
2. GPU에서 병렬처리 연산을 수행한다.
3. 연산이 끝난 후, 그 결과를 main memory로 복사한다.



본 글에서는 간단히, main memory 및 GPU memory 할당 및 복사 관련하여 다루도록 하겠다. 아래의 코드를 참고하도록 하자. 



1. 메모리 할당 


malloc() 함수는 익히 알고 있는 함수이다. main memory 에사용하고자 하는 크기만큼 공간을 할당해 준다. cudaMalloc() 함수는 malloc() 함수와 유사한 역할을 한다. 다른 점은 메모리 할당공간이 GPU memory 공간이다. 


2. 메모리 값 복사


cudaMemcpy() 함수는 main memory → GPU memory 값 복사 또는 GPU memory → main memory 값 복사 역할을 수행한다. 어디서 어디로 이동시킬지는 3번째 인자로 결정된다. cudaMemcpyHostToDevice는 main memory → GPU memory 이고, cudaMemcpyDeviceToHost는 GPU memory → main memory이다. 여기서 중요한 용어가 있는데, Host와 Device이다. CUDA에서는 CPU쪽을 Host, GPU쪽을 Device로 칭하고 있다.


3. 할당된 메모리 해제


main memory에서 할당된 메모리를 해제해주는 free() 함수의 역할을 GPU memory에서는 cudaFree() 함수가 수행한다.

 






글을 마치며..


이번 글에서는 CUDA가 무엇인지 왜 사용되는지 간단히 살펴보았고, CUDA의 동작방식 또 간단히 살펴보았다. 또한, GPU memory 할당/해제 함수와 main memory와 GPU memory 간 값을 복사하는 함수에 대해서도 살펴보았다. 다음 글에서는 실제 CUDA 라이브러리를 사용하기 위해 필요한 nvcc 컴파일러의 사용법을 간단한 예제를 통해 살펴보도록 하겠다.









Comments