最近在读professional cuda c programming.第三章里有一些关于nvprof的内容.记录一下过程中遇到的问题.
本书的代码可以在这里找到.
线程束分化
GPU在控制流上相对简单,相比GPU它没有复杂的分支预测机制,一个warp中所有线程在同一周期内必须执行相同指令.如果一个线程执行一条指令,那么warp中的所有线程都必须执行这条指令.如果同一warp中的线程使用不同的路径通过同一程序,则可能产生问题.例如:
if(cond){
true_branch();
}else{
false_branch();
}
如果线程束中一部分线程走真分支,另一部分执行假分支,则会违背上述原则.这被称为线程束的分化(warp divergence).这种情形下,warp将连续执行每个分支路径,禁用不执行这一路径的线程.如下图
显然这会导致性能的明显下降.
nvprof遇到的问题
按照书上的指引, 执行nvprof --metrics branch_efficiency ./simpleDivergence
, 会提示
==3906366== NVPROF is profiling process 3906366, command: ./simpleDivergence
./simpleDivergence using Device 0: GeForce GTX 1080 Ti
Data size 64 Execution Configure (block 64 grid 1)
==3906366== Warning: ERR_NVGPUCTRPERM - The user does not have permission to profile on the target device. See the following link for instructions to enable permissions and get more information: https://developer.nvidia.com/ERR_NVGPUCTRPERM
==3906366== Profiling application: ./simpleDivergence
==3906366== Profiling result:
No events/metrics were profiled.
==3906366== Warning: Some profiling data are not recorded. Make sure cudaProfilerStop() or cuProfilerStop() is called before application exit to flush profile data.
这里提供了报错信息的情景.依据这里的指引,这是因为获取这些数据的GPU Performance Counters被禁用了.我第一反应是使用管理员权限运行,即sudo nvprof
.结果却提示commad not found.
我们在linux运行modprobe nvidia NVreg_RestrictProfilingToAdminUsers=0
后,未解决问题.
随后尝试"Enable access permanently"一栏下的方法,在/etc/modprobe.d
目录下添加一个后缀名.conf
的文件,并输入options nvidia "NVreg_RestrictProfilingToAdminUsers=0"
.随后执行update-initramfs -u -k all
.注意这些都需要root权限.
重启系统,在终端输入cat /proc/driver/nvidia/params | grep RmProfilingAdminOnly
查看权限情况,然而一个大大的RmProfilingAdminOnly = 1
狠狠地嘲笑了我.
正当我准备放弃时,想到了在一个论坛帖子里看到一位网友使用绝对路径调用nvprof,遂尝试,问题解决.
那么为什么直接用sudo
会找不到命令呢?可以在这里找到答案.简单来说,sudo中有一个选项--with-secure-path
是默认开启的,此时它并不是在系统的PATH
下寻找,而是在/etc/sudoer
文件中的
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
这一项中寻找.默认来说是上面的内容.因此我们需要添加nvprof所在的路径.一般来说是/usr/local/cuda/bin/
.编辑sudoer
文件需要特殊的编辑器.在/etc
目录下,输入sudo visudo
,将路径添加进Defaults,注意加冒号.随后Ctrl + O
保存,回车,Ctrl + X
退出.随后就可以直接使用sudo nvprof
了.
这里列出了nvprof支持的所有metrics.
标签:bin,sudo,3906366,学习,手记,线程,usr,nvprof From: https://www.cnblogs.com/linxiaoshu/p/17273964.html