CUDA加速计算项目采坑总结

CUDA加速运算项目采坑总结

本篇博客主要记录研一上期末考试后,完成CUDA加速计算项目(C++)的采坑旅程。

1.Nsight5.2 BUG 不支持gtx1050和gtx1050Ti

Nsight是N厂开发用来配合Visual Studio调试GPU(device端)内存的插件。这个BUG,NVIDIA负全责。Nsight一般会随cuda的安装配套安装(我的cuda是8.0,配套Nsight5.2),但是坑爹的地方来了。cuda8.0有两个版本(具体可以在NVIDIA官网查到),所以Nsight5.2也是两个版本,官网的User Guide显示5.2是支持gtx1050和gtx1050Ti的,但是我的5.2是不支持的,只支持上半年的1060,1070,1080。

解决方法:

升级Nsight版本。

2.GPU浮点数计算精度问题

GPU端计算浮点数精度和CPU端不同。GPU默认是float精度,CPU默认是double精度。这就意味着在GPU作浮点数乘除计算结果如果累计的话,必然存在误差,并且误差会随累计从10^-6逐渐变大。

解决方法:

强制类型转换:ans =(double)a*(double)b;消除浮点数计算的累计误差。

3.kernel内部申请动态内存问题

官方文档有说明,计算能力在2.0以上的显卡都可以在kernel内部申请动态内存。语法同CPU端C/C++,malloc和new都可以。但是一定要记得free和delete。不过这样做分配内存的时间效率比在CPU(host端)用cudaMalloc之类的函数效率要低。另外就是动态内存大小也有上限,因为thread多了之后还蛮容易溢出的,需要注意。
这部分具体的可以参考stackoverflow动态内存

解决方法:动态内存申请了记得释放。

4.kernel内部计算没有被执行,感觉像被直接跳过了

这是因为块内的寄存器(register)不够了。你的显卡一个块内具体可以有多少寄存器可以通过launch bonds去计算,好像也有相关命令去改变cuda默认限制。

解决方法:

其实首先可以考虑改变整个程序架构,是不是设计的有问题,因为一般是不会register不足的。不然就该大限制或者优化变量内存。

5.unspecified launch failure in XXX 具体代码函数

这个BUG就有意思了,通俗来讲就是说GPU他平常是CPU的小弟,给老板打工的,CPU每隔一段时间就要压榨一下GPU让他来更新一下屏幕,具体时间间隔看系统(Win10是2s,xp和linux都是5s)。如果你现在压榨GPU给你打工(CUDA做计算)超过这个时间,CPU老板就会不高兴,就会报错。这个机制专业术语叫TimeoutDetection and Recovery mechanism,TDR。

解决方法:

Windows系统下可以参考TDR_Delay修改,这里感谢知乎用户:Russell 提供帮助。

猜你喜欢

转载自blog.csdn.net/u014744127/article/details/79431154