高
校校园,太平洋吹来暖湿的季风,学霸和学妹正在疯长,又到了大学生们最忙碌的季节——写论文。在导师眼中,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还被看成异构的时候,它也不是并行的。
问:调试出现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: 无法解析的外部符号 __imp__cutCheckCmdLineFlag@12,该符号在函数 _main 中被引用。怎么解决,引入什么
答:從CUDA 5.0起,例子裡面已經不包含cutil了。NV多次聲明,cutil只是給他們自家的例子用的,僅用於例子用途,不得在自己的項目中使用。而且從CUDA 5.0就已經被放棄了。目前有兩個選擇:
(1)修正所有抄襲自老版本例子的代碼,不要使用cutil
(2)降級CUDA到老版本。
答:没人要求必须一样的。显然可以不一样的。只要没有说明不可以的,那都是可以的。很多时候,我们往往可以在warp的级别进行差异执行的。(实际上,甚至可以每个线程都执行不一样的代码,但这样做性能低下,意义不大。所以说,一般可以在warp级别上)而block是warps的集合,显然更可以的。
答:这个是通用错误, 需要打开build log成诊断,才能看到具体实际错误。
在VS选项的projects and solutions的build and run里,将右侧的最下面的两个框都打到最大。 然后重新编译,就能看到错误。
(更多GPU编程问题,点击阅读原文,欢迎到我们的技术论坛提问)