编译和调试CUDA程序

编译CUDA程序

平台:vs2012+cuda 8.0
from:CUDA Toolkit document-Installation Guide Windows-Compiling CUDA Programs

1、创建新的项目:
新建项目-CUDA 8.0 Runtime

2、在现有项目中添加cuda代码
项目-属性-生成自定义-勾选CUDA 8.0
项目-添加-新建项-NVIDIA CUDA 8.0-C/C++ FILE, 添加cuda文件.cu

注意:最好每一次修改代码后,先清理,再编译,否则编译器可能会按照修改前的历史文件继续之前的编译,导致修改无效。

调试CUDA程序

参考Nsight 的说明文档,打开方式:VS菜单栏-NSIGHT-help-local help

本地VS中联合调试CPU+GPU代码

在vs中,默认使用native debug,此时无法调试cuda代码,提示“当前不会命中断点。没有与此行关联的调试程序的目标代码类型的可执行代码”

方法1:http://stackoverflow.com/questions/18515933/nvidia-visual-studio-nsight-cpu-and-gpu-debugging

开两个VS,主VS从VS主VS中通过NSIGHT-Star CUDA Debugging运行,事先在cuda代码中设置好breakpoint,此时程序运行到breakpoint;
从VS中工具-附加到进程,传输-选择默认值,限定符-选择本机用户,可用进程-选择主VS中运行的程序名,此时在从VS上的CPU代码中添加breakpoint即可。
该方法通过两个进程,一个通过cuda debug执行,一个通过native debug执行,从而实现cpu、gpu代码的同时调试。缺点是必须先执行cuda代码进入相应的breakpoint
这样做的原因是,cuda debug和native debug在同一个VS进程中无法共存。

方法2:Nsight 的说明文档“Attach to a Running CUDA Process”一节

同样需要开启两个vs,先执行native debug,后执行cuda debug。相对方法1要设置多几个步骤:
)Nsight Monitor (右下角系统托盘) -Options-> CUDA -> Use this Monitor for CUDA attach ->true
)添加环境变量 NSIGHT_CUDA_DEBUGGER=1
)在第二个VS中设置附加到进程,传输选择Nsight GPU Debugger,如果native debug的进程type显示cuda且灰色,说明环境变量没有设置成功;如果type没有cuda,说明进程已经附加到Nsight GPU Debugger

这个方法可以用在别的IDE,如matlab上调试cuda代码。
参考 :http://stackoverflow.com/questions/19069522/debug-cuda-kernel-on-mexfunction-by-attaching-matlab-with-nsight-gpu-debuger

添加环境变量的方法:
我的电脑属性-高级设置-环境变量-添加用户变量”NSIGHT_CUDA_DEBUGGER”,设置值为1-重启VS。
但这样设置的环境变量是全局有效的,会导致每次debug cuda代码都调用NSIGHT,影响cuda运行的效率。
尝试将环境变量设置为本进程有效,在vs中设置环境变量。
注意:通过vs的props文件或者user文件设置环境变量是不行的,因为这样只能设置生成(build)环境的环境变量,而cuda debug需要运行时的环境变量。
vs中设置调试的环境变量,项目属性-配置属性-调试-环境,添加$(NSIGHT_CUDA_DEBUGGER),不成功,附加到进程时依然显示灰色,只能采用系统添加环境变量的方法。

双机联调,官方文档中有说明

你可能感兴趣的:(cuda)