机器学习和生物信息学实验室联盟

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9249|回复: 8
打印 上一主题 下一主题

cuda编程需要注意的

  [复制链接]
跳转到指定楼层
楼主
发表于 2012-3-14 19:55:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       在编写cuda代码时,由于并行处理都是在GPU端,如果在设备端代码中不加捕捉异常的话,即使在GPU端运行出错了,你也不会知道出错了。GPU端的代码又不好调试,因此知道怎么在GPU端的代码添加异常捕捉是非常有必要的,当然这和在cup端的不太一样。以下是一段异常捕捉代码,供大家参考:
  1. void checkCUDAError(const char *msg)   
  2. {   
  3.     cudaError_t err = cudaGetLastError();   
  4.     if( cudaSuccess != err)   
  5.     {   
  6.         fprintf(stderr, "Cuda error: %s: %s.\n", msg,   
  7.                                   cudaGetErrorString( err) );   
  8.         exit(EXIT_FAILURE);   
  9.     }                           
  10. }  
复制代码
在代码前端,要记得声明函数,想要在哪里捕捉错误信息,就在哪里调用函数。例如:
  1. compare<<<DimGrid, DimBlock>>>(data,d_inf,d_result,d);
  2.      checkCUDAError("kernel invocation");
复制代码
  1. cudaMemcpy(h_result, d_result, sizeof(unsigned long)*row* r_width ,cudaMemcpyDeviceToHost);
  2.    checkCUDAError("memcpy");
复制代码
这里要注意的是CPU和GPU是异步执行的,因此在调用GPU端的compare函数时,即使在后面加了异常捕捉,也是捕捉不到错误的,因为cpu不等GPU端的代码执行完就先往下执行了,因此要等GPU端的代码执行完再捕捉才能捕捉的到。
      下面我跟大家分享一个我觉得大家在编程时需要注意的问题以及解决方案,以免大家重蹈覆辙,造成不必要的困扰。
      我编写的cuda程序在运行小数据的程序时,运行正确,但是运行大数据时,结果就不对了。于是便疯狂寻找程序本身的原因,以为是内存不足,因为显存只有1G,确实需要小心使用。但是尽管把程序的显存使用优化到极致,还是运行不正确。最后加了异常捕捉,出现了如下错误:
  
       出现这个错误的原因是由于机器的显卡在运行CUDA程序的同时,也在承担着机器的图形界面显示,因此不可能让CUDA程序无时间限制地一直占用GPU,这一项在GPU的参数中显示为:

一旦CUDA程序运行超过5秒钟,GPU就会终止程序的运行。
解决这个错误有两种方法:
1.在cpu中多次调用kernel函数,也就是把大数据分割成小数据,以保证每个kernel在5秒钟之内能运行完。
2.关闭GPU的显示功能,仅供计算使用,这样就会有时间的限制。
在Linux端,由于我们的显卡是专门做计算的,因此适合选择第2种方法。
目前我研究出的方法:在运行CUDA程序前,利用命令把图形界面关闭。命令:sudo stop gdm
当然不排除还有其他的硬性的办法,例如修改配置文件等等。
经过这番修改之后,运行cuda程序就没有时间限制了~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 转播转播 分享分享
回复

使用道具 举报

沙发
发表于 2012-3-14 20:28:33 | 只看该作者
好帖子啊!!!!摸索出经验!!

Run time limit on kernels  YES看看能不能通过修改cuda配置改成no?

关闭gdm意味着不能显示了,大不了把显示器去掉,关gdm。但这不方便要图形界面的同学操作啊。
回复 支持 反对

使用道具 举报

板凳
发表于 2012-3-14 21:18:13 | 只看该作者
很赞!

我想问一下:如果主板已经集成显卡了,可不可以把显示器连到主板上,显卡专用于计算?
回复 支持 反对

使用道具 举报

地板
 楼主| 发表于 2012-3-14 21:29:53 | 只看该作者
zouquan 发表于 2012-3-14 21:18
很赞!

我想问一下:如果主板已经集成显卡了,可不可以把显示器连到主板上,显卡专用于计算?

应该是可以,就像236服务器上就应该有设置好的。具体怎么做还要再学习一下。
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2012-3-14 21:31:27 | 只看该作者
xmubingo 发表于 2012-3-14 20:28
好帖子啊!!!!摸索出经验!!

Run time limit on kernels  YES看看能不能通过修改cuda配置改成no?

对的,如果要有图形界面的话,再开启。
回复 支持 反对

使用道具 举报

6#
发表于 2012-3-14 21:37:22 | 只看该作者
大宝 发表于 2012-3-14 21:31
对的,如果要有图形界面的话,再开启。

我觉得老师说的方法靠谱。你先试试能不能直接改设置,不能的话。我们试下把独立显卡挂到带集成显卡的板子上。然后,需要研究下怎么让系统图形界面默认应用集成显卡,同时我们的程序能访问独立显卡。
回复 支持 反对

使用道具 举报

7#
发表于 2012-3-14 22:32:07 | 只看该作者
桌子上的两台机器没有集成显卡;桌子左下角那台机器有集成显卡,不过是HDMI线,在柜子里。

HDMI线在windows下经常点不亮,不知为什么,所以我加了一块显卡。

以后做运算我都打算用X79主板(能上8条内存,但是都不集成显卡)。

需要的话,我把机群中剩下的几台也都可以加显卡,甚至多显卡交火。
回复 支持 反对

使用道具 举报

8#
发表于 2012-5-17 12:09:55 | 只看该作者
本帖最后由 xmubingo 于 2012-5-17 12:23 编辑

有时候会提示找不到gdm

这时候,关闭gdm还可以用
/etc/init.d/lightdm stop

貌似lightdm和gdm不一样。

http://forum.ubuntu.org.cn/viewtopic.php?t=300079
安装nv驱动前,先卸载已有的nouveau驱动。重启。
回复 支持 反对

使用道具 举报

9#
发表于 2012-8-7 20:34:48 | 只看该作者
本帖最后由 xmubingo 于 2012-8-7 20:35 编辑

我今天又搜索了许久。
windows会对图形显示的硬件做限制。并不是看“cudaGetDeviceProperties()中的kernelExecTimeoutEnabled属性”的问题。xp5秒,vista3秒。
http://topic.csdn.net/u/20100125 ... e-7c2f213c8a68.html
Linux下也会有限制:
http://blog.163.com/zhao_yunsong ... 930920117531240453/
如果 cuda 设备接有显示器,并且启动了X环境,那么,CUDA 程序在它上面的运行时间被限制在5秒以内。超过此时间,程序将被强制结束


那么剩下的解决办法还是:一个显卡做计算,一个显卡做显示。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

机器学习和生物信息学实验室联盟  

GMT+8, 2024-11-27 05:34 , Processed in 0.072848 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表