CUDA检查工具-cuda-memcheck
cuda-memcheck是CUDA工具包中的一个功能正确性检查套件。它包含多个可以执行不同类型检查的工具。这些工具可以精确地检测和归因CUDA应用程序中的越界和未对齐的内存访问错误。具体包括 memcheck、 racecheck、initcheck、 synccheck 共 4 个工具。它们可由可执行文件 cuda-memcheck 调用:
$ cuda-memcheck --tool memcheck [options] app_name [options]$ cuda-memcheck --tool racecheck [options] app_name [options]$ cuda-memcheck --tool initcheck [options] app_name [options]$ cuda-memcheck --tool synccheck [options] app_name [options]$ export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:Truememcheck:用于内存访问错误和泄漏检测 racecheck:共享内存数据访问危险检测工具 initcheck:未初始化的设备全局内存访问检测工具 synccheck:用于线程同步危险检测 具体参数信息可以参考官网:CUDA-MEMCHECK :: CUDA Toolkit Documentation (nvidia.com)
注意:此工具已在 CUDA 11.6 中被弃用,并在12.0 及更高版本中被删除。Compute Sanitizer 已取代它的位置,用法差不多,但是提供了额外的功能,如改进的性能和对 Microsoft hardware-accelerated GPU scheduling 的支持,以及对内存检查之外的功能的更广泛支持。
简单使用
如下有问题代码编译后,使用 cuda-memcheck ./test.out 或者compute-sanitizer ./test.out执行后则会得到一大段输出以及
![]()
========= ERROR SUMMARY: 2 errors
NVIDIA Compute Sanitizer
Compute Sanitizer 是一套工具,可以对代码的功能正确性执行不同类型的检查。 主要有四种工具:
memcheck:内存访问错误和泄漏检测。racecheck:共享内存数据访问危险检测工具。initcheck:未初始化设备全局内存访问检测工具。synccheck:线程同步危险检测。
$ nvcc -o mempool.exe mempool_example.cu -arch=sm_70$ ./mempool.exeAfter populateMemory 1: bucket 0, 1 .. 62: 0 1 .. 62After populateMemory 2: bucket 0, 1 .. 63: 0 1 .. 63
$compute-sanitizer --tool memcheck ./mempool.exe========= COMPUTE-SANITIZERAfter populateMemory 1: bucket 0, 1 .. 62: 0 1 .. 62After populateMemory 2: bucket 0, 1 .. 63: 0 1 .. 63========= ERROR SUMMARY: 0 errorsReference:
【1】https://blog.csdn.net/qq_33598781/article/details/136136951
【2】https://blog.csdn.net/kunhe0512/article/details/137119826
【3】CUDA-MEMCHECK :: CUDA Toolkit Documentation (nvidia.com)
【4】Hardware Accelerated GPU Scheduling - DirectX Developer Blog (microsoft.com)