1 )CUDA的程序,经常犯,但是很难发现的一个错误就是同步问题。

描述下实例

for (k = 0; k < N; k+=BS)
{
    sda[tx] = gda[tx+index];
    __syncthreads();
    for (j = 0; j  < BS; j++)
    {
        tp += sda[j]
    }
    out[index+tx] = tp;
}

看看上面的代码,好像没问题。

其实当N < BS的时候上面的代码是没有问题的。但是当N大于BS的时候,每个线程会至少循环两次,这样问题就来了。

假设第一个warp的线程已经执行完了out的赋值,但是第二组warp还在计算那个tp,tp依赖于在shared memory中的数据,如果第一个warp开始执行sda那一句话的话,第二个warp就会得到错误的数据。

虽然你有一个同步了!

解决方法很简单,就是在out输出之后加一个同步操作,当然你加到sda前面也是可以的。

补充一点,这个问题如何发现呢?只要比对下两次执行的结果,看看是否一致,如果结果不一致,那么就很有可能犯了同步的错误。

2)CUDA程序第二经常犯的错误就是线程访问显存越界,或者共享存储器访问越界

如何发现这个问题呢。这种情况下,一般你的kernel不会启动成功。如果不会启动成功,也不一定能就是越界问题,如果你的kernel中使用了过多的共享存储器,也不会启动成功的。

遇到启动不成功的时候,你首先要计算下shared memory是否超出了硬件范围,至于硬件的shared memory有多少,你还需要查一下,我正能说,这个跟GPU的核心有关,你只要根据你的设备计算能力取查找就行了。

如果是因为越界,可以将kernel函数一点点注释起来,查看输出结果。步步蚕食。一定会找到越界的位置。找到后自己解决就行了。

。。。未完待续。。。

CUDA程序的调试总结【不定时更新】的更多相关文章

  1. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  2. ASP.NET中设置一个定时器来定时更新 转

    asp.net 定时器 比较少用,  中国红木网这是一个相当实用的功能,有了RSS博客镜像,就不需要在多处同时发布博客日志了.比如你同时在新浪上有自己的博客,又同时有自己的个人博客站点,那么你只需要在 ...

  3. Delphi应用程序的调试(五)其他调试工具

    Delphi应用程序的调试(五)其他调试工具 Delphi7中提供了一些附加调试工具来帮助用户检查程序错误.从性能上讲,其中一些工具属于高级调试工具.尽管高级调试工具不像其他工具那样常用,但对于经验丰 ...

  4. Vivado_MicroBlaze_问题及解决方法_汇总(不定时更新)

    Vivado_MicroBlaze_问题及解决方法_汇总(不定时更新) 标签: Vivado 2015-07-03 14:35 4453人阅读 评论(0) 收藏 举报  分类: 硬件(14)  版权声 ...

  5. Java专业技能面试问题(不定时更新)

    刚看到园友五月的仓颉<面试感悟----一名3年工作经验的程序员应该具备的技能>感觉很不错,不论是为面试跳槽准备,还是打算深化精进自己的技术都可以参考一下.面向工资编程多少也有点道理,虽然技 ...

  6. celery介绍、架构、快速使用、包结构,celery执行异步、延迟、定时任务,django中使用celery,定时更新首页轮播图效果实现,数据加入redis缓存的坑及解决

    今日内容概要 celery介绍,架构 celery 快速使用 celery包结构 celery执行异步任务 celery执行延迟任务 celery执行定时任务 django中使用celery 定时更新 ...

  7. iOS 属性修饰符记录 --不定时更新

    重新审视了一下OC在属性修饰符,特意记录一下来.以后不定时更新 > retain:只有在非ARC下才会有效,所有如果在ARC下使用了retain修饰也白搭 如以下的data属性用retain修饰 ...

  8. MATLAB调用C程序、调试和LDPC译码

    MATLAB是一个很好用的工具.利用MATLAB脚本进行科学计算也特别方便快捷.但是代码存在较多循环时,MATLAB运行速度极慢.如果不想放弃MATLAB中大量方便使用的库,又希望代码能迅速快捷的运行 ...

  9. linux下svn定时更新项目

    方法一.用shell脚本定时更新项目   1.进入网站的根目录,假设项目位置放在/var/www/test cd /var/www/test   2.建立脚本文件update.sh,分两步进行.首先利 ...

随机推荐

  1. ubuntu + 不识别无线网卡简易处理方式 + 需有线联网

    进入ubuntu, 连接有线网; 系统设置 -> 软件和更新 -> 附加驱动 -> 找到无线网卡驱动并更新 若无候选的无线网卡驱动,我就没招了.

  2. Node.js 控制台

    稳定性: 4 - 冻结 {Object} 用于打印输出字符到 stdout 和 stderr.和多数浏览器提供的 console 对象函数一样,Node 也是输出到 stdout 和 stderr. ...

  3. Jupyter Notebook 添加目录

    1.  安装 jupyter_contrib_nbextensions pip install jupyter_contrib_nbextensions 2. 配置 nbextension jupyt ...

  4. C/C++静态数组与动态数组的区别

    简介 以下三行代码有什么区别? int a[10]; int *a = (int*)malloc(sizeof(int)*10); int *a = new int[10]; 第一行代码定义a为包含1 ...

  5. SQL Server 虚拟化(1)——虚拟化简介

    本文属于SQL Server虚拟化系列 前言: 现代系统中,虚拟化越来越普遍,如果缺乏对虚拟化工作原理的理解,那么DBA在解决性能问题比如降低资源争用.提高备份还原速度等操作时就会出现盲点.所以基于本 ...

  6. Linux & Windows 计时函数

    直接上代码: #if defined(_WIN32) && defined(_MSC_VER) #include <windows.h> double abtic() { ...

  7. 探究java接口中的变量与方法

    关于变量 java接口里的变量都是默认 pubic static final的 为啥? public 接口得能被所有对象调用 static 这个变量是属于接口本身,而不是实现了接口的对象的 具体来说  ...

  8. JAVA面向对象-----super关键字

    JAVA面向对象-–super关键字 1:定义Father(父类)类 1:成员变量int x=1; 2:构造方法无参的和有参的,有输出语句 2:定义Son类extends Father类 1:成员变量 ...

  9. SSO 基于CAS实现单点登录 实例解析(二)

    本文目录: 概述 演示环境 部署CAS-Server相关的Tomcat 部署CAS-Client相关的Tomcat 测试验证SSO 第一: 本demo在一个机器上实现(三个虚拟主机),来看SSO单点登 ...

  10. UNIX网络编程——揭开网络编程常见API的面纱【上】

    Linux网络编程API函数初步剖析 今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作. 1.socket(famil ...