ComputerGraphics/책

[CUDA기반 GPU병렬 처리 프로그래밍] 벡터 합 연산

장 코범 2024. 10. 17. 16:50
728x90
반응형

 

아래 코드 흐름

 

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를 믿고 계속 공부하자!

728x90
반응형