본문 바로가기

Programming/Todo's CUDA

CUDA의 기본 - 1

01. CPU의 데이터 처리


CUDA 프로그램의 진행 순서는 기존에 CPU에서 진행하는 과정과 약간 다르다.


싱글 코어


C, C++ 또는 다른 언어로 프로그램을 구현하게 되면 컴퓨터는 다음과 같이 동작하게 된다.


1. 입력과 출력에 사용할 메모리를 할당한다.

2. 처리하고자 하는 데이터를 메모리에 입력한다.

3. 연산을 하고자 메모리에 있는 데이터를 CPU(레지스터)로 가져온다.

4. 정수 연산은 ALU에서 실수 연산은 FLU에서 처리한다.

5. 처리된 레지스터의 값을 메모리로 출력한다.

6. 사용한 메모리를 해제한다.





멀티 코어


우리가 작성하는 코드는 모두 동일한 과정을 통해 처리되고, 또 이런 방식에 아주 익숙해져 있다. 만일 CPU가 멀티코어로 이루어져 있고 프로그램이 4개의 스레드로 구현되었다면 다음과 같은 구조로 동작하게 된다.



1. 입력과 출력에 사용할 메모리를 할당한다.

2. 처리하고자 하는 데이터를 메모리에 입력한다.

3. 연산을 하고자 하는 데이터를 4등분 하여 메모리에 있는 데이터를 각각의 코어로 가져온다.

4. 데이터를 4개의 스레드로 처리한다.

5. 처리된 4개의 데이터를 병합한다.

6. 처리된 레지스터의 값을 메모리로 출력한다.

7. 사용한 메모리를 해제한다.







02. CUDA의 데이터 처리


2.1. CUDA의 데이터 흐름


CUDA는 뛰어난 그래픽 카드의 연산 능력을 이용하여 처리하는 방법이다. 따라서 기존의 CPU 처리방법에 더 추가해야 하는 과정이 있다.


추가된 과정 - PC의 메모리에 있는 입력 데이터를 그래픽 카드의 메모리로 전달하고 GPU가 처리한 결과를 다시 그래픽 카드의 메모리에서                       PC의 메모리로 가져오는 과정 


(점선으로 표시된 부분이 추가된 데이터 이동이다)


CUDA의 데이터 흐름


1. 그래픽 카드 메모리 공간을 할당한다.

2. PC의 입력 데이터를 그래픽 카드의 메모리로 복사한다.

3. 강력한 GPU성능을 이용하여 병렬처리한다.

4. 처리된 결과를 그래픽 카드의 메모리에서 PC의 메모리로 복사한다.




2.2. 그래픽 카드 메모리 사용하기


-그래픽 카드 메모리 할당-


문법


cudaError_t cudaMalloc(void** devPtr, size_t count);




cudaMalloc() 함수는 그래픽 카드의 DRAM에 메모리 공간을 할당하는 기능을 한다.


첫번째 인자 : 할당할 메모리를 가리키는 포인터

두번째 인자 : 할당할 메모리의 크기


cudaError_t : 함수 호출의 성공 여부를 나타내는 반환값

-성공 : cudaSuccess 를 반환

-실패 : 실패한 원인을 알 수 있는 약 20가지의 값을 반환



-그래픽 카드 메모리 해제-


문법


cudaError_t cudaFree(void** devPtr);




cudFree() 함수는 그래픽 카드의 DRAM에 할당된 메모리를 해제


인자 : 해제하고자 하는 포인터



-PC에서 그래픽 카드로 데이터 복사-


문법


cudaError_t cudaMemcpy(void* dst, const void* src, size_t count, cudaMemcpyHostToDevice);




cudaMemcpy() 함수는 메모리를 복사할때 사용한다.

주요한 용도는 PC 메모리에서 GPU 메모리로 또는 GPU 메모리에서 PC 메모리로 데이터를 전송하는 역할이다.


첫 번째 인자 : 복사할 목적지가 되는 포인터, cudaMalloc() 함수로 할당한 그래픽 메모리의 포인터를 넣는다.

두 번째 인자 : 복사할 소스가 되는 포인터, PC에서 Malloc()로 할당한 메모리의 포인터를 입력한다.

세 번째 인자 : 복사할 크기

네 번째 인자 : 복사를 수행할 종류


enum cudaMemcpyKind kind


cudaMemcpyHostToHost        :    PC 메모리에서 PC 메모리로 복사

cudaMemcpyHostToDevice     :    PC 메모리에서 그래픽 카드로 복사

cudaMemcpyDeviceToHost     :    그래픽 카드서 PC 메모리로 복사

cudaMemcpyDeviceToDevice     :    그래픽 카드에서 그래픽 카드로 복사



예제 - 그래픽 카드에 메모리 사용하기


#include <stdio.h>


int main() {


int InputData[5] = { 1,2,3,4,5 };

int OutputData[5] = { 0 };


int *GraphicsCard_memory;


//그래픽 카드 메모리의 할당

cudaMalloc((void**)&GraphicsCard_memory, 5 * sizeof(int));


//PC에서 그래픽 카드로 데이터 복사

cudaMemcpy(GraphicsCard_memory, InputData, 5 * sizeof(int), cudaMemcpyHostToDevice);


//그래픽 카드에서 PC로 데이터 복사

cudaMemcpy(OutputData, GraphicsCard_memory, 5 * sizeof(int), cudaMemcpyDeviceToHost);


//결과 출력

for (int i = 0; i < 5; i++)

printf("OutputData[%d] : %d\n", i, OutputData[i]);


//그래픽 카드 메모리의 해제


cudaFree(GraphicsCard_memory);


return0;

}















'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란?  (0) 2019.01.28