c语言cuda核函数 c语言内核深度解析

cuda调用核函数出现 IntelliSense错误:应输入表达式It could be that the Intellisense database is screwed up. Here's what I've done to correct it when it happens to me:
1、Make sure your code is in a state where everything will compile.
2、Exit Visual Studio
3、Delete the .suo and .sdf files in the solution's directory. (Deleting the .suo probably isn't necessary to this cleanup process, but it doesn't hurt.)
4、Open the solution in Visual Studio.
5、Select Build -- Batch Build.
6、In the Batch Build window, click "Select All", and then "Rebuild".
CUDA核函数不执行通常是由于什么原因原因有多种多样c语言cuda核函数的:
(1)其中常见c语言cuda核函数的一种是,32 * 32 = 1024线程c语言cuda核函数的block大?。?超出c语言cuda核函数了贵卡的能力范围 。
(需要fermi+的,请告知一下你的卡的信息)
(2)此外的一种常见原因是越界访存 , 请确保你用的数据(例如缓冲区)也随之相应扩大c语言cuda核函数了 。
建议:
(1)检查offset的值范围,看看能否在(32,32,1)的block shape下 , 超出有效范围 。
(2)在代码里读取dis[offset]前, 用if (offset....) 来限制一下(....是你自己知道的一个范围) 。
【c语言cuda核函数 c语言内核深度解析】 (3)如果(1)(2)未能解决问题,则开启nsight的cuda memory checker, 直接用nsight定位可能的越界位置 。
如何进行CUDA C程序核函数的调试由于CUDA调试工具的不完善、CUDA调试工具上手难度较高 , 并行思想本身就难调试等因素,CUDA调试一直都是一件很蛋疼的事情 。写CUDA也有三四年了,前段时间在群里见别人问CUDA调试的问题 , 突然有想法写个CUDA调试的博客 。自己经验尚浅,希望各位大大看过后能够在评论里指点一二 , 共同完善这篇博客 。
本博客只针对逻辑bug 。
1定位bug
出现bug的第一想法自然是定位bug 。cuda比较奇特的地方在于,有时报错bug在500行,但500行出的代码没有错误,而是在1000行的地方逻辑错了,十分头疼 。
下面介绍三种我总结的定位bug方法:
1.1二分法
一半一半的注释代码,定位bug 。比较笨拙和麻烦,但是十分好用 。
1.2输出定位法
将整体代码分为几个模块,正常的CUDA代码大概可以分为数据初始化,内存申请,内存拷贝,核函数执行 , 结果拷贝等模块 。在每个模块结束后输出标志,示例如图1 。这样在调试时就可以根据输出快速定位bug大约在什么位置 。如下图:
1.3调试工具
对于部分bug,可以用调试工具更快速的定位 。
在linux下,对于访存越界等问题,cuda gdb可以直接定位在崩溃那一行 。
win下是Nsight,我不熟悉nsight,求大神补充 。
2解决bug
比较简单的bug,定位后基本就一眼就解决了 。但对于复杂的bug , 还是比较费劲的 。
2.1调试工具
单步调试,打断点 。无论是cuda gdb还是Nsight,都可以定位到某一个线程上进行调试 , 可以说是非常强大 。cuda gdb和nsight都有英文官方文档,建议大家都学一学 , 熟练后调试事半功倍 。
但因为大量线程随机并行执行,有时并不知道该定位到哪个线程上;线程调试不容易控制;定位到单线程调试比较费劲 , 费时间;教程少(虽然有官方文档),上手难度较大一些 。这些都是CUDA调试工具没有被广泛接受的原因 。
2.2缩小数据量或线程数并在核函数中打印
大量线程并行是导致CUDA调试难度大的最大原因 , 尽量的减少并行量是一个非常好的降低调试难度的办法 。“小并行”甚至“串行”能够大大方便调试 。

推荐阅读