본문 바로가기
CUDA 프로그래밍

SAXPY(Single-precision A-X Plus Y)

by 채소장사 2020. 3. 3.

CUDA 프로그래밍 예제로 가장 흔히 사용하는 SAXPY(Single-precision A-X Plus Y)스칼라 곱과 백터 합이 결합된 함수로서 GPU 병렬연산의 기본적인 내용을 설명하기에 적합하다.

이번 포스트에서는 C++를 이용한 단순한 SAXPY 코드와 CUBLAS 라이브러리를 이용한 SAXPY 실행방법을 살펴본다. 

단순하게 쓰레드의 인덱스를 결정하기 위해서, 그리드와 블록 모두 1차원 형태로 가정하였다. restrict 포인터는 메모리 접근을 최적화하기 위해 사용하였다. 

 

cublas 라이브러를 이용하는 경우, cublasSaxpy( )를 이용해서 동일한 연산을 시행할 수 있다. 위와 비교해봤을 때, 직접 SAXPY에 대한 커널 작성이 필요없음을 알 수 있다. 

참고로 cublasAlloc( )과 cublasFree( )는 각각 cudaMalloc( )과 cudaFree( )에 대한 불필요한 래퍼함수란 판단으로 deprecated 되었다. 따라서 굳이 사용할 필요는 없지만, cudaMalloc( )에 비해 인자값이 조금 다르므로 레거시 코드를 볼 경우를 생각해서 사용해보았다. 마지막으로 cublas를 사용한 경우, -lcublas 플래그를 줘서 컴파일 해야함을 주의해야 한다.

 

참고)

https://devblogs.nvidia.com/six-ways-saxpy/

https://github.com/JonathanWatkins/CUDA/blob/master/saxpy.cu

https://dojang.io/mod/page/view.php?id=760

댓글