병렬 프로그래밍/CUDA

[기본] Visual Studio에서 CUDA 디버깅 하기

매운돌 2023. 4. 11. 03:09

CUDA를 이용하여 개발을 하다 보면 익숙하지 않은 동작과 환경 때문에 어려움이 많습니다. 그래서 C++에서 디버깅하던 방식 그대로 Breakpoint를 걸어서 내가 원하는 값의 상태를 보면 좋겠다는 생각을 많이 하게 될 것입니다. 그래서 이번 글에서는 Nsight Visual Studio Edition을 이용하여 간단하게 디버깅 하는 법을 공유해볼까 합니다.

 

먼저 CUDA를 디버깅 하기 위해서는 Nvidia의 Nsight가 설치되어 있어야 합니다.
(아래의 링크에서 설치 줍니다.)
https://developer.nvidia.com/nsight-visual-studio-edition

 

NVIDIA Nsight Visual Studio Edition

For compute developers working in Eclipse development environment, please see Nsight Eclipse Edition NVIDIA® Nsight™ Visual Studio Edition is an application development environment for heterogeneous platforms which brings GPU computing into Microsoft Vi

developer.nvidia.com

 

 

그리고 Visual Studio에서 CUDA를 디버깅 하기 위해서는 기본적으로 아래의 옵션이 Yes로 등록되어 있어야 합니다.

만약 CMake로 빌드한다면, 아래 처럼 CMakeLists.txt에서 설정할 수 있습니다.

set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -G")
 
그리고 이전에 설치했던 Nsight가 제대로 설치 되었다면 아래의 이미지 처럼 Extensions에서 노출되어 보일 것 입니다. 그리고 Start CUDA Debugging을 시작하게 되면 우리가 일반적으로 C++을 디버깅했을때와 같은 화면 구성이 나타나게 됩니다.

하지만, 다른 점이 있다면 kernel 함수에 Breakpoint를 걸 수 있고 해당 지점에서 멈춘다는 점입니다. 

이때 Breakpoint가 걸린 상태에서 Extensions > Windows를 클릭하면 아래 처럼 다양한 정보 창들을 선택하여 볼 수 있습니다.

 

저는 디버깅을 할 때 Warp Watch와 Lanes 창을 주로 사용합니다.
Lanes는 거의 Thread Index를 보는데 사용하고, 나머지 디버깅을 위해 값을 확인하는 작업은 Warp Watch를 활용합니다.

아래의 이미지 처럼 Breakpoint시점에 Warp내 값들을 조회해 보면서 현재 계산이 정상적으로 이루어지는지 확인해 볼 수 있습니다.

 

그 밖에도 Warp Info, Resources, GPU Registers와 같은 정보 창도 존재하는데, 해당 창의 사용법은 위의 Nividia Nsight 홈페이지에서 쉽게 확인할 수 있습니다.