1. Introduction

CUDA 10.1推出了新的API:The Compute Sanitizer API,提供了更底层更丰富的Instrumentation API。

https://docs.nvidia.com/cuda/sanitizer-docs/SanitizerApiGuide/index.html

目前相关文档还比较简单,本文记录下官方Sample:Memory Tracker 的使用方法。

2. 开启GPU的开发模式

Linux 418.43 or later driver会默认开启保护模式,最简单的验证方法是使用nvprof来测试程序,如果出现了ERR_NVGPUCTRPERM: Permission issue with Performance Counters,则说明保护模式已经开启。关闭的方法见官方的说明:

https://developer.nvidia.com/nvidia-development-tools-solutions-ERR_NVGPUCTRPERM-permission-issue-performance-counters

简单概括一下:

  1. sudo vim /etc/modprobe.d/nvidia.conf添加内容options nvidia "NVreg_RestrictProfilingToAdminUsers=0
  2. 重启

3. Sanitizer API的sample

CUDA官方给了一个查看cuda程序memory访问的sample:

https://github.com/NVIDIA/compute-sanitizer-samples

以memory tracker为例,

3.1 编译sample

进入MemoryTracker目录make即可编译生成libMemoryTracker.so MemoryTrackerPatches.fatbin两个文件。

你可能需要constexpr size_t MemAccessDefaultSize为更大的数值,否则程序可能会卡住无法进行。

3.2 修改目标程序的编译参数

为了能够统计目标程序在运行时的memory访问,需要修改目标程序的编译参数,以便将触发tracker的代码“融入”到目标程序中。

修改主要包括两部分,一个是include头文件的引入,一个是lib库文件的引入。

LIB       += -L.  -lsanitizer-public -lMemoryTracker
INCLUDES  += -I.  -I /usr/local/cuda/extras/Sanitizer/include

$(NVCC) $(NVCC_FLAGS) $(LIB) $(INCLUDES) 

-I引入sanitizer的头文件。而-l部分则是引入需要的两个so库文件。注意一般来说-L是引入库文件所在的目录,-l才是引入需要的库文件。

引入编译好的libMemoryTracker.so最简单的方法是直接将so文件copy到当前目录,然后添加-lMemoryTracker引用即可。(否则你不止需要在makefile中添加库文件地址,还需要在系统的ld变量中添加库文件的地址)

一个简单的/usr/bin/sanitizer.sh文件如下:

#!/bin/bash
cp /home/find/gdrive/PhD/git/MemoryTracker/libMemoryTracker.so  /home/find/gdrive/PhD/git/MemoryTracker/MemoryTrackerPatches.fatbin  ./
cp /usr/local/cuda/extras/Sanitizer/libsanitizer-public.so ./
echo "sanitizer libs updated"

4. 获得运行结果

如果已经修改好了编译参数而且成功进行了编译,按照原来执行cuda程序的方式执行即可。

你会获得类似如下的输出:

  [63723] Read access of global memory by thread (0,0,411) at address 0x7025c966c (size is 4 bytes)
  [63724] Read access of global memory by thread (0,0,252) at address 0x7025c9bf0 (size is 4 bytes)
  [63725] Read access of global memory by thread (0,0,253) at address 0x7025c9bf4 (size is 4 bytes)
  [63726] Read access of global memory by thread (0,0,254) at address 0x7025c9bf8 (size is 4 bytes)
  [63727] Read access of global memory by thread (0,0,388) at address 0x7025c9610 (size is 4 bytes)

具体输出可以参考memory tracker的源码进行修改或分析。


文章版权归 FindHao 所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明作者 FindHao 和本文原始地址:
https://www.findhao.net/easycoding/2563.html

Comments

comments powered by Disqus