2022. 11. 15. 20:14ㆍCUDA
프로그램 구현 시 컴퓨터의 동작 순서
1.입력과 출력에 사용할 메모리 할당
2.처리하고자 하는 데이터를 메모리에 입력
3.연산을 하고자 메모리에 있는 데이터를 CPU(레지스터)로 가져옴
4.정수 연산은 ALU에서 실수 연산은 FPU에서 처리
5.처리된 레지스터의 값을 메모리로 출력
6.사용한 메모리 해제
스레드로 구현된 프로그램 구현 시 컴퓨터의 동작 순서
1.입력과 출력에 사용하는 메모리 할당
2.처리하고자 하는 데이터를 메모리에 입력
3.연산을 하고자 데이터를 4등분하여 각각의 코어로 가져옴
4.데이터를 4개의 스레드로 처리
5.처리된 4개의 데이터를 병합
6.결과를 메모리에 출력
CUDA의 데이터 흐름
1.그래픽 카드 메모리 공간 할당
2.PC의 입력 데이터를 그래픽카드의 메모리로 복사
3.GPU를 이용하여 병렬처리
4.처리된 결과를 그래픽 카드의 메모리에서 PC의 메모리로 복사
CUDA를 이용하여 데이터를 병렬처리하는 과정
1,입력과 출력에 사용할 데이터를 PC 메모리에 할당
2.입력과 출력에 사용할 데이터를 그래픽 메모리에 할당
3.처리하고자 하는 값을 PC메모리에 입력
4.PC메모리에 있는 입력 데이터를 그래픽 메모리로 복사
5.데이터를 분할하여 GPU로 가져옴
6.수천 개 이상의 스레드를 생성하여 커널 함수로 병렬처리
7.처리된 결과를 병합
8.PC메모리에 결과 전송
9.그래픽 메모리 해제
10.PC 메모리 해제
CUDA 커널
CUDA커널 함수는 GPU에서 동작하는 명령어 세트의 조합으로 수많은 코어에서 동시에 멀티스레드로 동작함
__global__ void KernelFunction(int a, int b, int c){
}
__global__ 지시어를 통해 사용할 수 있는 영역 구분
커널함수 사용 시 제약사항 : 반환값을 항상 void로 지정해야 하고 미리 지정한 인수를 사용해야 함. 인자의 개수를 변경하면서 호출하는 형식의 가변형 인수는 사용할 수 없음.반환값을 받을 수 없어서 결과를 가져오려면 포인터 변수를 이용한 반환형 인자를 사용해야 함.
GPU에서 사용되는 함수이기 때문에 인자로 사용되는 포인터 변수가 가리키는 영역은 그래픽 카드에 할당된 메모리여야 한다.
만들어진 커널 함수 호출
KernelFunction << 블록, 스레드 >>>(1,2,3);
//<<<, >>> : 스레드의 생성을 지정하는 기호. 여기에 생성할 스레드 개수 설정
//총 스레드의 개수 : 블록 X 블록당 스레드 수
//ex)36개의 스레드 생성
KernelFunction <<< 6, 6>>>(1,2,3);
기존의 CPU처리 방식의 프로그램을 CUDA 방식으로 전환하는 프로젝트를 진행한다면 프로젝트를 시작하기 전에 사용되는 데이터의 용량을 정하고 실제로 PC에서 그래픽 카드로, 또 그래픽 카드에서 PC로 데이터를 복사하여 시간을 측정해본다. 이 시간을 기준으로 기존의 CPU 처리 방식의 시간이 적게 든다면 계속 전통적인 방식을 사용하는 것이 좋다.
'CUDA' 카테고리의 다른 글
메모리 아키텍처 (0) | 2022.11.22 |
---|---|
스레드 스케줄링 Thread Scheduling (0) | 2022.11.22 |
스레드 블록 아키텍처 Thread Block Architecture (0) | 2022.11.16 |
CUDA C (0) | 2022.11.16 |
CUDA 프로세서 아키텍처 (0) | 2022.11.16 |