[CUDA기반 GPU병렬 처리 프로그래밍] 벡터 합 연산
아래 코드 흐름
C스타일 벡터 합 연산
1. A,B,C에 메모리를 동적할당해주고 0으로 초기화한다.
2. A,B에 값을 랜덤으로 넣어준다. (각각의 인덱스마다 랜덤으로 )
3. C에 A+B의 값을 넣어준다. (같은 인덱스끼리의 합)
위의 코드를 CUDA를 이용해서 GPU에서 처리해보자.
혼자서 해보고 답을 비교해보자
순서 Hint.
1. GPU에 메모리 할당
2. Device 메모리 초기화
3. Host To Device 값 복사
4. GPU연산
5. Device To Host 값 복사
6. 메모리 해제
CUDA 벡터 합 연산
잘된다!
시간 측정
측정할 때 주의할 점
- 메모리를 GPU에게 전송하는 것은 Host에는 없는 명령어이다.
지금까지 사용하던 명령어들은 CUDA 알고리즘이다. 이 시간들(데이터 전송시간 host->device, device->host)도 시간을 측정할 때 당연히 포함시켜야한다.
- Device에서 명령어를 실행할 때 Host에서도 비동기적으로 명령어들을 수행한다.
그렇기 때문에
시간 측정 시작
GPU에게 명령
시작측정 끝
이렇게 코드를 짜면 0초에 가깝게 측정될 것이다,
cudaDeviceSynchronize()를 통해서 Device가 끝날 때까지 기다렸다가 시작측정을 종료해야지 Device가 명령을 수행하는데 걸린 시간을 측정할 수 있다.
시간 측정 시작
GPU에게 명령
GPU기다리는 명령어
시작측정 끝
이렇게 작성해야 된다.
- 데이터를 전송할 때는 동기적으로 코드가 실행되기 때문에
데이터 전송에 한에서 cudaDeviceSynchronize() 명령어를 생략해도 된다.
timer0 : host 계산속도
timer1 : host->device 데이터 전송속도
time2 : device 계산속도
timer3: device->host 데이터 전송속도
아무리 봐도 device에 보내는 것이 훨씬 느리다....
하지만 지금까지는 1024크기의 덧셈을 했을 뿐이다..
앞으로 훠훠훠훠훨씬 복잡한 계산을 할 것이고
그러면 CUDA의 매력을 느낄 수 있으............면 좋겠다!
CUDA를 믿고 계속 공부하자!