前言

在用 CUDA 对 GPU 进行并行编程的过程中,除了需要对线程架构要有深刻的认识外,也需要对存储系统架构有深入的了解。

这两个部分是 GPU 编程中最为基础,也是最为重要的部分,需要花时间去理解吸收,加深内功。 

了解 GPU 存储系统架构的意义

CUDA 编程架构的设计思路本身也就是让程序员去使用缓存,而不是让缓存像 CPU 编程结构那样对程序员透明。

通过对所使用存储结构的优化,能够让程序的并行后的效果得到很大提高。

因此,这个问题是需要我们在开发全程中考虑的。

第一层:寄存器

每个流处理器中的寄存器数以千计,每个线程都能分配到其私有的寄存器,这样做的好处是使得线程的切换几乎是零开销 (也许说是线程束的切换会更为准确)。

应当在硬件条件允许的情况下,尽可能地使用寄存器 (注意是硬件条件的允许之下)。

在核函数中定义的变量就是寄存器变量。

第二层:共享内存

共享内存的本质是可受用户控制的一级缓存。每个 SM 中的一级缓存与共享内存共享一个 64 KB的内存段。在费米架构中,可以为每个块定义 16 KB的共享内存。灵活地使用共享内存,能够大幅度提高显存的带宽。此外,共享内存也是实现块内线程间通信的有效工具。

使用时需要注意的一个地方是,只有在确定需要重复利用此空间的数据,或者明确要使块内线程进行通信的前提下,才考虑使用共享内存。(原因不解释)

使用时需要注意的另一个地方是应当尽可能地避免存储体冲突。这里所谓的存储体是指实现共享内存的硬件 - 一个费米架构的设备上有 32 个存储体。解决此问题的关键在于:顺序访问存储体。

实际开发中,常常将一个任务分解成多个部分(不论是任务分解还是数据分解),共享内存在其中扮演着任务块工作任务汇总或者数据块工作任务汇总的角色。

核函数中定义的变量加上__shared__声明后就会存放在共享内存中了。

第三层:常量内存

常量内存其实只是全局内存的一种虚拟地址形式,并没有特殊保留的常量内存块。

使用起来非常方便,在主机端对需要放到常量内存区的变量添加 __constant__ 关键字声明之即可。

唯独需要注意的是,如果一个常量仅仅是一个字面值,那么将它声明为宏也行,例如 PI 这样的常数就一般定义为宏。

第四层:全局内存

全局内存,也就是显存。

在主机端开辟的显存空间均属于全局内存范畴。

使用全局内存的时候,需要注意的是应当学会对显存采取合并的访问方式。何谓合并的访问方式呢?请参阅下篇文章。

第四篇:GPU 并行编程的存储系统架构的更多相关文章

  1. 四 GPU 并行编程的存储系统架构

    前言 在用 CUDA 对 GPU 进行并行编程的过程中,除了需要对线程架构要有深刻的认识外,也需要对存储系统架构有深入的了解. 这两个部分是 GPU 编程中最为基础,也是最为重要的部分,需要花时间去理 ...

  2. 第三篇:GPU 并行编程的运算架构

    前言 GPU 是如何实现并行的?它实现的方式较之 CPU 的多线程又有什么分别? 本文将做一个较为细致的分析. GPU 并行计算架构 GPU 并行编程的核心在于线程,一个线程就是程序中的一个单一指令流 ...

  3. 三 GPU 并行编程的运算架构

    前言 GPU 是如何实现并行的?它实现的方式较之 CPU 的多线程又有什么分别?本文将做一个较为细致的分析. GPU 并行计算架构 GPU 并行编程的核心在于线程,一个线程就是程序中的一个单一指令流, ...

  4. 第五篇:浅谈CPU 并行编程和 GPU 并行编程的区别

    前言 CPU 的并行编程技术,也是高性能计算中的热点,也是今后要努力学习的方向.那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为将来深入学习 CPU 并行编程技术打下铺 ...

  5. 五 浅谈CPU 并行编程和 GPU 并行编程的区别

    前言 CPU 的并行编程技术,也是高性能计算中的热点,也是今后要努力学习的方向.那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为将来深入学习 CPU 并行编程技术打下铺 ...

  6. 【并行计算-CUDA开发】GPU并行编程方法

    转载自:http://blog.sina.com.cn/s/blog_a43b3cf2010157ph.html 编写利用GPU加速的并行程序有多种方法,归纳起来有三种: 1.      利用现有的G ...

  7. GPU并行编程小结

    http://peghoty.blog.163.com/blog/static/493464092013016113254852/ http://blog.csdn.net/augusdi/artic ...

  8. GPU并行编程:内核及函数的实现

    原文链接 回想一下我们之前在设备上使用“kernelFunction<<<1,1>>>(..)”执行一个函数的代码,我在那里还曾说过后面会细说,本文就详细介绍一下参 ...

  9. 第六篇:GPU 并行优化的几种典型策略

    前言 如何对现有的程序进行并行优化,是 GPU 并行编程技术最为关注的实际问题.本文将提供几种优化的思路,为程序并行优化指明道路方向. 优化前准备 首先,要明确优化的目标 - 是要将程序提速 2 倍? ...

随机推荐

  1. tomcat 的线程池配置,字符编码设置

    优化tomcat配置  ,修改原先的配置 conf/server.xml 配置 <Executor name="tomcatThreadPool" namePrefix=&q ...

  2. .NET项目web自动化测试实战——Selenium 2.0

    PS:这次用公司的项目来练手,希望公司不会起诉我,因为我绝对是抱着学习的态度,没有任何恶意.仅供交流学习. 该项目是基于SharePoint平台所开发的门户网站,为了切身感受一下Selenium 2. ...

  3. Ajax初窥

    Ajax四个步骤 1. 创建Ajax对象2. 连接到服务器3. 发送请求4. 接收返回值 0x01 创建AJAX对象 方法1(非IE6.0) Var oAjax = new XMLHttpReques ...

  4. 【WPF】给UserControl引入多个资源

    问题:为了方便资源的复用,我们通常会把资源单独抽取为一个资源文件,供其他文件引用.而用户自定义控件UserControl中经常需要引入多个资源文件.而在XAML中由于标签UserControl.Res ...

  5. linux 共享内存shm_open实现进程间大数据交互

    linux 共享内存shm_open实现进程间大数据交互 read.c #include <sys/types.h> #include <sys/stat.h> #includ ...

  6. window上将MongoDB的启动加入到服务中

    在系统管理员的命令行模式中: 进入mongo的安装目录,参照如下: 其中: --dbpath为保存的数据的路径 mongod --bind_ip --serviceName "MongoDB ...

  7. 分布式系统技术系列--租约(lease) (转载)

    租约(lease)在英文中的含义是“租期”.“承诺”,在分布式中一般描述如下: Lease 是由授权者授予的在一段时间内的承诺. 授权者一旦发出 lease,则无论接受方是否收到,也无论后续接收方处于 ...

  8. drupal 使用步骤

    一.安装 二.汉化 ①.下载语言包文件:http://localize.drupal.org/translate/languages/zh-hans ②.将 .po 文件放置到 drupal7/pro ...

  9. tar -h 参数

    1.1.1 tar命令参数-h,-h参数会把软链接指向的文件也打包. [root@ob2 mytmp]# ll total 8 -rw-r--r--. 1 root root 910 Aug 12 2 ...

  10. Restful --- 让JSON回归单纯

    设计模式才是软件哲学的根本.. 一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓 ...