前言

在用 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. 3D跑马灯效果

    睡了13个小时,发烧终于退了,持续2周的感冒看起来终于好了点,这一周一直在看perspective的一些资料,写一个3D跑马灯的效果. 个人感觉主要就是理解视角的概念,也就是perspective和p ...

  2. ssh 移植记录

    利用buildroot 先编译一个 sshd cd buildroot-2016.05/ make menuconfig Target packages ---> Networking appl ...

  3. usb 转 uart cp210x 驱动解析

    USB 转 uart (cp210x.c) 驱动解析 * usb_serial_driver 结构体解析 include/linux/usb/serial.h /** 描述一个usb 串口设备驱动 * ...

  4. ExtJs 通过分析源代码解决动态加载Controller的问题

    通过分析源代码解决动态加载Controller的问题 最近在研究ExtJs(4.2.0)的MVC开发模式,具体Extjs的MVC如何使用这里不解释,具体参见ExtJs的官方文档.这里要解决的问题是如何 ...

  5. Nhibernate 一对一,一对多,多对多 成功映射

    前语: 在Nhibernate xml 的文件配置上,一对一和多对多的配置比较简单,容易出错的反而是一对多(多对一)上. 1.一对一关联关系的映射: <one-to-one name=" ...

  6. javascript 鼠标方式去显示

    document.write("<style type='text/css'>"); document.write(".yyfloat_p{width:209 ...

  7. Entity Framework应用:使用LINQ操作

    一.什么是LINQ TO EntitiesLINQ,全称是Language-INtegrated Query(集成语言查询),是.NET语言中查询数据的一种技术.LINQ to Entities是一种 ...

  8. JS下拉图片Demo3

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. (四)Qt实现自定义模型基于QAbstractTableModel (一般)

    Qt实现自定义模型基于QAbstractTableModel 两个例子 例子1代码 Main.cpp #include <QtGui> #include "currencymod ...

  10. 自然语言交流系统 phxnet团队 创新实训 个人博客 (二)

    因为项目用的到条件编译,遂专门记载: 众所周知在C和CPP中可以通过预处理语句来实现条件编译,但是在java中没有预处理语句,我们该如何实现条件编译呢? 这是一个简单的demo public clas ...