본문 바로가기

Programming/Todo's CUDA

CUDA의 기본 - 2

2.3 CUDA 데이터의 병렬처리


CPU의 처리과정에서 여러 개의 코어가 있을 때 데이터를 분할하여 전송하고 이를 처리하기 위해서 워커함수를 스레드로 생성하여 병렬로 처리한다. CUDA프로그램 도 그 과정은 동일하지만 규모가 더 크다.



아래의 그림에서는 36개의 코어를 나타내었고 데이터릐 흐름은 6개만을 표현하였다. 실제로 CUDA 프로그램에서는 128개~ 512개의 코어로 데이터가 입력되어 동작하게 된다.





CUDA를 이용한 데이터의 병렬처리 과정


① 입력과 출력에 사용할 데이터를 PC메모리에 할당한다.

② 입력과 출력에 사용할 데이터를 그래픽 메모리에 할당한다.

③ 처리하고자 하는 값을 PC 메모리에 입력한다.

PC 메모리에 있는 입력 데이터를 그래픽 메모리로 복사한다.

데이터를 분할하여 GPU로 가져온다.

⑥ 수천개 이상의 스레드를 생성하여 커널함수로 병렬처리 한다.

⑦ 처리된 결과를 병합한다.

⑧ PC메모리에 결과를 전송한다.

⑨ 그래픽 메모리를 해제한다.

⑩ PC메모리를 해제한다.



윈도우 멀티스레딩 프로그램의 워커함수와 같이 CUDA에서도 연산을 처리하는 함수가 있는데, 이것을 ' 커널 ' 이라고 한다. 

커널 함수는 GPU 코어에서 동작하면서 실제로 연산을 하는 작업을 진행하게 된다. 

워커함수와 커널 함수의 차이점은 스레드를 생성하는 과정에 있다.


워커함수 - 스레드를 별도로 생성하는 과정이 있다.


커널함수 - CUDA프로그램은 커널함수를 호출하면서 스레드를 생성하는 작업까지 함께 진행한다.





2.4 CUDA 커널 함수


GPU에서 동작하는 명령어 세트의 조합으로 수많은 코어에서 동시에 멀티 스레드로 동작하게 된다.




문법


__global__ void KernelFunction(int a, int b, int c)

{

}


__global__    :  지시어가 붙어있어 사용할 수 있는 영역을 구분해준다는 점이다.


반환값        :  항상 void로 지정해야 한다.


인자의 갯수 :  가변형 인수 사용불가, 미리 지정된 인수를 사용하여야 한다.


**반환값이 없어서 결과를 가져오려면 포인터 변수를 이용한 반환현 인자를 사용해야 한다.

**GPU에서 사용되는 함수이기 때문에 인자로 사용되는 포인터 변수가 가리키는 영역은 그래픽 카드에 할당된 메모리여야 한다.



호출하는 방법



KernelFunction<<< 블록, 스레드 >>>(1, 2, 3);



<<<, >>> 기호의 추가 : 스레드의 생성을 지정하는 기호로, 여기에 생성할 스레드의 개수를 설정한다.


생성되는 총 스레드의 개수 = 블록 X 블록당 스레드 수


**블록: 스레드를 포함하는 집단을 의미한다.



예제

#include <stdio.h>


__global__ void KernelFunction(int a, int b, int c)

{

int sum = a + b + c;

}


int main(){

KernelFunction<<6 , 6>>(1, 2, 3);


printf("스레드 호출 \n");

return 0;

}



2.5 데이터 전송 부하


CUDA 프로그래밍에서 새로 추가된 PC와 그래픽 카드 사이의 데이터 복사 과정은 기존의 CPU처리 방식에서 추가된 부분이다. 데이터를 복사하는 과정은 매우 느린 작업이기 때문에 그 시간을 측정해서 CPU 처리 방식으로 걸리는 방식과 비교하여 더 빠른 방식을 선택하는 것이 좋다.



통상적으로 DRAM에서 CPU의 데이터를 처리하는 시간과 그래픽 DRAM에 있는 데이터를 GPU로 처리하는 시간을 비교하면 GPU의 처리 시간이 압도적으로 빠르게 나타난다. 하지만, PC 메모리에서 그래픽 카드 메모리로 데이터를 복사하는 시간을 포함하게 되면, 연산 횟수가 적은 프로그램은  CPU를 이용했을때 더 빠른 경우가 발생한다.


연산 횟수가 적은경우

연산 횟수가 많은경우


(부등호는 유리한 방향을 의미)


CPU 처리 방식의 프로그램을 CUDA방식으로 전환하는 프로젝트를 진행한다면 프로젝트를 시작하기 전에 사용하는 데이터의 용량을 정하고 실제로 PC에서 그래픽카드로, 또 그래픽 카드에서 PC로 데이터를 복사하여 시간을 측정 해본다. 이 시간을 기준으로 기존의 CPU 처리 방식의 시간이 적게 든다면 계속 전통적인 방식을 사용하는 것이 프로젝트의 유지 보수에도 좋고 추가적인 비용이 소용되지도 않는다.



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

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