index 石家莊網站建設友鏈交易平臺源碼
CUDA編程(六):代碼分析與調試
- 代碼分析與調試方法
- 使用printf打印變量信息
- 使用CUDA的錯誤檢查功能
- 使用CUDA-GDB進行調試
- 使用Nsight進行調試
- 使用nvprof / nvvp工具
- 參考文獻
代碼分析與調試方法
CUDA代碼的運行時可能會遇到內存溢出、內存非法訪問、核函數出錯等一系列問題,需要進行Debug調試。在CUDA代碼的分析與調試過程中,通??梢圆捎靡韵聨追N方法。
使用printf打印變量信息
在CUDA程序中,可以使用printf()函數打印變量信息。但是需要注意,由于CUDA是并行計算架構,因此在使用printf()函數時需要謹慎,避免對性能造成過大的影響。
使用CUDA的錯誤檢查功能
在CUDA中,可以使用錯誤處理函數檢查CUDA程序哪一個環(huán)節(jié)出現錯誤。在每次CUDA函數調用后,使用該函數進行檢查,并打印錯誤信息以幫助診斷問題。另外,也可以使用cuda-memcheck工具來檢查內存錯誤。
CUDA編程中錯誤處理相關的函數一共有4個:
// cudaGetErrorName函數接受一個錯誤碼,返回錯誤名稱
__host__ __device__ const char* cudaGetErrorName(cudaError_t error)
// cudaGetErrorString函數接受一個錯誤碼,返回錯誤描述
__host__ __device__ const char* cudaGetErrorString(cudaError_t error)
// cudaGetLastError函數返回上一次CUDA runtime調用時的錯誤碼,并將CUDA錯誤碼置為cudaSuccess
__host__ __device__ cudaError_t cudaGetLastError(void)
// cudaPeekAtLastError函數與上面功能一樣,但不會重置CUDA的錯誤信息
__host__ __device__ cudaError_t cudaPeekAtLastError(void)
使用CUDA-GDB進行調試
CUDA-GDB是一個基于命令行的調試工具,可用于調試CUDA C/C++應用程序。使用CUDA-GDB可以設置斷點、單步調試、查看變量值等。需要在編譯時使用-g、-G選項來生成可調試版本。CUDA-GDB使用方法如下:
# 編譯程序的時候我們使用nvcc編譯器,將其編譯成可調式版本;-g 表示將CPU代碼(host)編譯成可調式版本,-G表示將GPU代碼(kernel)編譯成可調式版本。
nvcc -g -G XXX.cu -o XXX
# 進入調試器
cuda-gdb XXX
# run執(zhí)行
run
使用Nsight進行調試
Nsight 開發(fā)工具套件提供深入的跟蹤、調試、評測和其他分析,以優(yōu)化跨 NVIDIA GPU 和 CPU 的復雜計算應用程序,包括 x86、ARM 和 Power 體系結構。一般在裝CUDA時,在圖形界面已安裝好Nsight。用終端打開Nsight編譯器,它可以直接對寫好程序進行編譯和Debug。關于如何使用Nsight調試程序,可以參考鏈接。
使用nvprof / nvvp工具
NVIDIA nvprof / nvvp工具是英偉達N卡GPU編程中用于觀察的利器。全稱是NVIDIA Visual Profiler,是由2008年起開始支持的性能分析器。它具有交互性好,利于使用的優(yōu)點,并且可用于分析CUDA應用程序的性能瓶頸和優(yōu)化方案,其在安裝好CUDA toolkit后方可使用。
在CUDA程序調試過程中,Visual Profiler提供每個CUDA函數調用的時間分析,它還能給出如何調用內核函數以及存儲器的使用情況等,有助于定位瓶頸可能出現的位置,并詳細解釋如何調用內核等。
記錄運行日志時使用命令nvprof,可視化顯示日志時使用命令nvvp。如果只想對某一段代碼進行分析,在目標代碼段前后加上 cudaProfilerStart() 和 cudaProfilerStop()。
# 使用 nvprof 在命令行查看分析結果
nvprof -o out.nvvp XXX
# 對于生成的 out.nvvp 文件,需要在使用 nvvp 進行查看。
以上是一些常用的CUDA代碼調試的方法,希望對您有所幫助,歡迎在評論區(qū)留言。
參考文獻
https://zhuanlan.zhihu.com/p/559682306