前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CUDA菜鸟必看:论坛里那些总是被问到的问题.....

CUDA菜鸟必看:论坛里那些总是被问到的问题.....

作者头像
GPUS Lady
发布2018-04-02 14:23:59
2.3K0
发布2018-04-02 14:23:59
举报
文章被收录于专栏:GPUS开发者GPUS开发者

校校园,太平洋吹来暖湿的季风,学霸和学妹正在疯长,又到了大学生们最忙碌的季节——写论文。在导师眼中,GPU能为学生发毕业论文带来好运,值得为它冒险。现代社会,驱动的安装和CUDA环境的配置更加便捷,而每个月,GPU世界论坛总会被问到这写问题.....

显卡用于计算时,如果出现黑屏然后提示......

问题:请教:显卡用于计算时,如果出现黑屏然后提示“驱动程序已停止响应并已重启”,只需把tdrlevel设为0就行了么?还有没别的高招?

回答:修改kernel, 将每次计算限制在2s以内是正道。否则你的kernel只能在你这台机器上运行,换了机器,继续停止响应。正常的使用OpenCL的软件,kernel都不会运行上个几十秒的。建议拆分成更小的规模,多次启动。而不是任何方式的修改TDR/禁用TDR.OpenCL/CUDA通用的。Intel也通用的。

以及,如果方便,请更换tesla卡 TCC驱动。此时你可以随意运行。

直接购买Tesla,能解决一切烦恼。什么?你觉得Tesla卡贵?游戏卡性能更好?一般武侠小说里面有一个规律,神兵利器,都只是低等级角色看中的。对于高手而言,飞花拈叶即可伤人,换句话说,想要用便宜的硬件达到一定效果,起码得有点水平,知道怎么整,否则,花钱堆硬件也可以弥补 ,两头都占上,一般没那么好的事情。

异构计算和并行计算是一回事情么?

答:是否异构是针对你的host cpu来说的,因为我们常用的GPU的指令集架构不同于CPU。 所以称为异构计算。而异构和并行没有任何关系。

例如CPU上开多个线程进行并行某计算,显然不是异构的。而很多年前,在x87还被看成异构的时候,它也不是并行的。

不用nsight调试正常,一旦调试就出现这个情况?

问:调试出现Memory Checker detected xx access violations!,咋回事,显存没有越界,咋回事呢,不用nsight调试正常,一旦用nsight调试就出现这个情况。

答:关于nsight的报告,只要nsight报告了,你就一定越界了。请相信nsight。不用nsight调试正常,其实已经不正常了,只是有的时候,轻微越界无症状而已。(因为有分配粒度之类的影响因素)但只要nsight报告越界,你肯定越了。 这100%是代码的BUG,100%越界了。只是此BUG平日潜伏,而nsight将它抓了出来而已。(这就相当于一个医生检查了下你的身体后告诉你,你身体里潜伏了某疾病,然后你不听,说医生乱扯,说我平日好好的) 。

如何检查越界

答:nsight自带的memory checker可以自动检查,此功能是默认启用的,你用nsight调试一下,会自动报告哪里越界.

1:按照debug编译你的工程

2 : 确保VS的nsight菜单下的memory checker被选中(默认选中的. 如果你没改的话).

3:选择start cuda debugging

如果有越界或者kernel启动失败等,会在右下角弹出说明的

请注意, 常规运行的时候, 因为分配粒度的原因,程序中的轻微越界不一定会挂掉kernel,但是启用memory checker能够捕捉这些越界, 报告潜在的BUG.

如果看到memory access volations,就是越界了,回去回去检查显存的分配, 下标, 以及指针的使用。

你也可以检查你得到错误结果的时候,kernel是否正常执行了

具体方法为:

your_kernel<<<>>>();

cudaError_t err1,err2;

err1=cudaGetLastError();

printf("error code= %d , %s"\n,err1,cudaGetErrorString(err1));

err2=cudaDeviceSynchronize();

printf("error code= %d , %s"\n,err2,cudaGetErrorString(err2));

这段代码虽然不能精确的报告出错位置, 但可以分别告诉你kernel是否启动成功, 和执行过程中是否出错.

为啥我的速度变慢了?

问:请教个问题,一个由多个核函数组成的功能,调用一次大约4ms,10次大约20ms,可次数为100时,耗时20s,这是什么原因

答:八成是你代码在调用100次的时候,host code中间长期阻塞了。我建议你用profiler看。而不是自行测试时间。太多的人,自行测试极度不准的。用profiler其实有很多好处,例如你看到时间线,中间如果有,例如18秒的大幅度空白,那么就是你的host代码不知道干啥去了。此时你就不能怪GPU突然变慢10倍。(从理论的2s -> 20s) 而应该检查你的host code这段期间干啥去了,为啥没有及时给gpu发布任务。(例如,你的host code此时在访问磁盘,而磁盘正好有坏扇区或者坏道,卡住了. 或者host code在进行socket传输, 网络变卡. )(导致18s无响应)等等吧。各种情况都有的。显卡本身不可能突然慢100倍。这显然不会是显卡的问题。(因为你之前还能以2ms一次的速度执行的,证明卡是好的)(后来变成200ms一次(20s,100次),只可能是你的host code导致的其他方面的问题)(而不会是卡突然变慢100倍)你说呢。

windows下的vs怎么查看呢?

问:linux下的集成开发环境可以看各种不同的线程,那windows下的vs怎么查看呢?

答:VS需要启动CUDA debugging后才能看的。首先请检查你的VS是否有nsight菜单,如果没有,证明你没安装好,请重新按照VS--VS的补丁包---CUDA Toolkit的顺序重装。重装后一般即可在VS中看到nsight菜单,看到nsight菜单后,使用cuda debugging后,并在任意kernel断点中停住后,可以在nsight菜单里的各个选项,看到线程信息,warps信息,blocks信息,global memory中的内存等等。具体的用法请先阅读完手册再使用。

建议看nsight user guide学会.此手册免费随着cuda toolkit发放。就在你的硬盘上。

error LNK2019: 无法解析的外部符号

问:error LNK2019: 无法解析的外部符号 __imp__cutCheckCmdLineFlag@12,该符号在函数 _main 中被引用。怎么解决,引入什么

答:從CUDA 5.0起,例子裡面已經不包含cutil了。NV多次聲明,cutil只是給他們自家的例子用的,僅用於例子用途,不得在自己的項目中使用。而且從CUDA 5.0就已經被放棄了。目前有兩個選擇:

(1)修正所有抄襲自老版本例子的代碼,不要使用cutil

(2)降級CUDA到老版本。

一个kernel,每个block里的算法必须一样吗?

答:没人要求必须一样的。显然可以不一样的。只要没有说明不可以的,那都是可以的。很多时候,我们往往可以在warp的级别进行差异执行的。(实际上,甚至可以每个线程都执行不一样的代码,但这样做性能低下,意义不大。所以说,一般可以在warp级别上)而block是warps的集合,显然更可以的。

MSB3721 是什么错误啊

答:这个是通用错误, 需要打开build log成诊断,才能看到具体实际错误。

在VS选项的projects and solutions的build and run里,将右侧的最下面的两个框都打到最大。 然后重新编译,就能看到错误。

(更多GPU编程问题,点击阅读原文,欢迎到我们的技术论坛提问)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 异构计算和并行计算是一回事情么?
  • 不用nsight调试正常,一旦调试就出现这个情况?
  • 如何检查越界
  • 为啥我的速度变慢了?
  • error LNK2019: 无法解析的外部符号
  • 一个kernel,每个block里的算法必须一样吗?
  • MSB3721 是什么错误啊
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档