如何写出正确CUDA程序(持续更新中)

本文不谈CUDA优化,只谈如何正确写出CUDA程序,先写对,再说优化。最近写CUDA程序也是断断续续的,经常程序写完了需要很长的时间调试,各种错误,调试的方法也是简单的printf(),目前没找到更好的调试方法,如果有更好的办法的化希望告知。
昨天总结了下为什么写的CUDA程序总是出错(就先别说优化呢?写对再再谈别的吧),总结出一些心得和经验(算是经验)吧,结合例子看吧。

首先谈谈调试方法吧,目前我遇到的主要是两种错误:内存错误逻辑错误其他错误

其他错误

对于其他错误,一般加上错误处理即可,错误处理见CUDA编程的错误处理
这样便于快速定位,不加的话出错误了定位更难受。

内存错误

目前对于内存错误,编译的时候加入下面选项

-ftz=true -Xcompiler -rdynamic -lineinfo

运行的前可以先用cuda-memcheck检查下

cuda-memcheck a.out

如果有内存错误,会输出报告,告知你哪一行访问了非法内存,往往问题是出在kernel里,这样就可以快速定位到行,进行排错了。cuda-memcheck还有其他很多功能,目前我就用到这个,其他的等需要的时候再说吧。

逻辑错误

确定好没有内存错误,没有其他错误后,发现结果不对,这也是最头疼的地方,目前为止一直用的printf打印方法来进行观察,没用过cuda-gdb,也在网上搜索了很多关于CUDA的调试方法,也没有个好的结果,用cuda-gdb一是感觉还得学cuda-gdb的使用,而是使用起来也不是那么方便(没有细看cuda-gdb的用法,有兴趣的可以看看),这里对于printf方法,也是摸索出一些方法。首先写程序的时候这样写CUDA Pro Tip:Write Flexible Kernels with Grid-Stride Loops,这样是为了用printf调试方便。用printf调试的时候,把block数和thread数都设置为1,就可以很好的用printf进行调试了。用printf的时候也可以一个功能一个功能(一段代码一段代码)的进行打印,这样来进行定位。

自己总结的一些小经验,有更好的方法,希望大家指出。


如何写出正确的CUDA程序

每次写完CUDA程序后总是各种错误,然后拍错会花很长的时间,好吧,我承认是自己太笨的原因。总结出一些小方法(大神勿喷)
先看一个例子,矩阵*向量,看看调试方法以及自己的思考
kernel1(错误)

__global__ void MxvBlock(const float *h_a, const float *h_b, 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值