CUDA常见问题与解答
1.在SDK自带的例子程序中,发现SRC文件珜下有.cpp文件和.cu文件。这两种文件的关系和各自的作用是什么呀?
答:SDK自带例子中的.cpp文件主要是一些CPU端处理,或者是使用CPU计算对照组结果,在某些例子中也会在.cpp文件中以函数的形式调用封装成C或者C++函数的GPU端代码.cu文件中通常是与GPU核函数和CUDA API相关的内容。
2.在SDK自带的例子程序中,有一些带有_kernel的.cu文件,在Visual Studio工程中的图标上有一个红色的符号,是什么意思?
答:大多数SDK例子程序都将设备端代码和主机端代码放在不同的文件中,以template为例如:它的主机端代码在template.cu中,设备端代码在template_kernel.cu中,并且有一个用于对照的CPU 和GPU结果的cpmpute_gold.cpp文件。template_kernel.cu 在visual Studio工程中的符号代表它不参与编译。注意到template.cu文件中已经通过#include"template_kernel.cu"包含了template_kernel.cu。如果要将SDK中的代码直接用于其他工程中,一定要注意将带有_kernel后缀的.cu文件排除在编译外,避免重复定义。
3.为什么编译CUDA程序时,经常出现未定义变量的错误?
答:存储在某些存储器中的某些变量,如__constant__,__device__,texture, 必须在所有的函数定义外定义,即定义的全局变量。这些变量必须有正确的作用域,例如texture型变量必须对设备端代码和主机端代码同时可见,并且如果需要从主机端访问时,也要对主机端代码可见。SDK中的例子通过文件包含解决了这些问题。读者可以将主机端代码和设备端代码都写在一个.cu文件中,或都是将这些变量定义在头文件中(注意避免重复定义)来解决这些问题。
4.为什么在工程中无法使用原子函数,双精度等功能?
答:首先,必须确定目前使用的设备的计算能力版本能支持相应的函数;其次,在编译时,nvcc编译器默认的目标设备为计算能力1.0版本,无法支持高计算能力版本的函数,需要通过-code,-arch等编译选项打开。
5.CUDA程序运行时出现蓝屏、死机等现象,或者打印出kernel luanch timed out?
答:早期版本的CUDA更加容易出现蓝屏或者死机,目前已经大有改善。造成蓝屏、死机、自动重启等现象的常见原因主要有:访问显存时发生趆界、多个线程竞写同一数据。kernel launch timed out的原因是Windows操作系统会查询显卡状态,如果显卡长时间没有反应就会重启显卡,这限制了一个kernel的执行时间。经过试验,在XP系统下kernel不能超过12秒,而Vista和Win7操作系统的时间还要更短一些。如果发生这一问题,应该首先检查代码中是否出现了死循环或者竞写,然后采用减小kernel、采用stream操作等手段避免。如果确实需要在一个kernel中完成较大的计算量,可以使用更强的显卡、使用专门的Tesla流计算方案、改用Linux操作系统,或者使用一块不进行显示的显卡(但是Vista和Win7有时会关闭没有插显示器的显卡)。未来版本的CUDA会对这些问题继续进行改进。
6.为什么在编译或者运行时会出现资源不足的提示?
如果在程序中使用了太多的register,shared,texture或者constant资源,在编译时会出现报错;如果运行中使用了太多的显存,或者是一个block中的线程太多,在运行时会出现错误。在低运算能力版本的硬件上运行为高计算能力设备编写的程序时也会发生错误。在使用变量时,需要注意各种变量的大小不能超过目标设备的计算能力版本本的相应限制,使用的显存也不能超过显存的量(如果这个显卡还需要输出显示,还要减去显示使用的显存大小)。解决资源方法主要有:减少程序使用的资源,注意释放不用的显存和内存,可者将问题进行分治。如果确有需要,应该使用拥有更大存储器的显卡,或者Tesla,Quadro等专业解决方案。
7.为什么时候在程序中无法得到正确的结果?为什么有时每次运行的结果都不同?为什么GPU的结果与CPU的结果不同?
答:由于CUDA中存在大量线程的并行,因此程序中细小的错误也会产生相当严重的后果。造成结果错误的可能原因有:死循环、类型溢出、错误的数据类型、访存赿界、竞写、缺乏同步、编译器因素等。如果是发生多线程竞写一个数据的情况,应该采用原子操作来避免;在shared memory 发生warp间交换操作的数据时,一定要使用栅栏同步保证数据的可靠性;编译器会优化掉它认为多余的的存储访问,要通过valid关键字进行管理;过于复杂的循环有时无法被正确解析,产生错误结果。如果同一个程序对同一组数据每次运行得到的结果不同,一般是发生了竞写,或者缺乏同步。GPU和CPU的运算单元采用了不同的微架构,因此即使都符合IEEE 754规范,结果不一样是理所当然的。由于CPU 中可以使用更长字长的存储器来保存中间变量,因此通常使用CPU计算得到的结果要略高一些。
CUDA常见问题与解答的更多相关文章
- 关于Installshield里一些常见问题的解答—艾泽拉斯之海洋女神出品
原文:关于Installshield里一些常见问题的解答-艾泽拉斯之海洋女神出品 上一篇:一个完整的安装程序实例—艾泽拉斯之海洋女神出品(五) --补遗转载时请务必保留转载出处和由艾泽拉斯之海洋女神出 ...
- 【Keras学习】常见问题与解答
Keras FAQ:常见问题 如何引用Keras? 如果Keras对你的研究有帮助的话,请在你的文章中引用Keras.这里是一个使用BibTex的例子 @misc{chollet2015keras, ...
- Handler的源码和常见问题的解答不崩溃
Handler是Android中的消息处理机制,是一种线程间通信的解决方案,同时你也可以理解为它天然的为我们在主线程创建一个队列,队列中的消息顺序就是我们设置的延迟的时间,如果你想在Android中实 ...
- PHP浮点数的一个常见问题的解答 (转载 http://www.laruence.com/2013/03/26/2884.html)
不过, 我当时遗漏了一点, 也就是对于如下的这个常见问题的回答: <?php $f = 0.58; var_dump(intval($f * 100)); //为啥输出57 ?> 为啥输出 ...
- OpenShare常见问题及解答
OpenShare常见问题及回答: Q:OpenShare可以整合SAP么? A:当然可以,OpenShare是真正完全开放的产品,但要进行二次开发,事实上我们帮我们大部分的客户都整合了SAP,包括数 ...
- PHP浮点数的一个常见问题的解答
作者: Laruence 本文地址: http://www.laruence.com/2013/03/26/2884.html 转载请注明出处 关于PHP的浮点数, 我之前写过一篇文章: 关于PHP浮 ...
- Keras官方中文文档:常见问题与解答
所属分类:Keras Keras FAQ:常见问题 如何引用Keras? 如何使Keras调用GPU? 如何在多张GPU卡上使用Keras "batch", "epoch ...
- CUDA常见问题之无法在c文件中调用cu文件中定义的函数
当在C源文件中调用cu文件中定义的函数时,会出现undefined reference的问题,而在C++源文件中调用cu文件中定义的函数时则不会出现这个问题. 出现上述问题的原因是,nvcc编译器采用 ...
- TFS2012常见问题及解答
1.删除workItem工作项(包括Bug,用户场景,任务等) 需要利用到witadmin工具,目录在cd %programfiles%\Microsoft Visual Studio 11.0\Co ...
随机推荐
- 清除input框对浏览器保存的用户名和密码自动填充问题
清除input框对浏览器保存的用户名和密码自动填充问题: type类型写如下写法,聚焦的时候type类型为“password” <input ng-model="getpwd" ...
- express-http-proxy 的基础使用
const app = express() app.use(matchPath, proxy(serverAddress, { proxyReqPathResolver: function(req) ...
- 简单的方法爬取b站dnf视频封面步骤解释
这随笔代码链接:http://www.cnblogs.com/yinghualuowu/p/8186375.html 首先我们要知道,一个分区封面显示到底在哪里可以找到. 很明显,查看审查元素并不能找 ...
- Linux--6 redis订阅发布、持久化、集群cluster、nginx入门
一.redis发布订阅 Redis 通过 PUBLISH .SUBSCRIBE 等命令实现了订阅与发布模式. 其实从Pub/Sub的机制来看,它更像是一个广播系统,多个Subscriber可以订阅多个 ...
- 常见的web性能优化方法
前言:关于优化问题,随着项目经验不断累积,多方查找资料进行拼接合并,形成如下文章,之后遇到类似好的方法,会不断补充完善. 前端是庞大的,包括 HTML. CSS. Javascript.Image . ...
- python中深复制和浅复制区别
在python中,对象赋值实际上是对象的的引用,当创建一个对象,然后把它赋值给另外一个变量的时候,python没有拷贝这个对象,而只是拷贝了这个对象的引用,多以就出现了浅复制,即复制后原对象改变后,复 ...
- @Import @bean,@Conditional @ConfigurationProperties @EnableConfigurationProperties 注解使用
一分钟学会spring注解之@Import注解http://blog.51cto.com/4247649/2118354 @Autowired与@Resource 注解的使用 https://www. ...
- Sqoop环境安装
环境下载 首先将下载的 sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz放到 /usr/hadoop/目录下(该目录可以自定义,一般为Hadoop集群安装目录),然 ...
- Java匹马行天下之JavaWeb核心技术——JSP
JSP动态网页技术 一.JavaWeb简介 一.什么是JavaWeb? JavaWeb是用Java技术来解决相关web互联网领域的技术总称. 需要在特定的web服务器上运行,分为web服务器和web客 ...
- 机器学习框架ML.NET学习笔记【1】基本概念与系列文章目录
一.序言 微软的机器学习框架于2018年5月出了0.1版本,2019年5月发布1.0版本.期间各版本之间差异(包括命名空间.方法等)还是比较大的,随着1.0版发布,应该是趋于稳定了.之前在园子里也看到 ...