title: 【CUDA 基础】4.1 内存模型概述
categories:
- CUDA
- Freshman
tags:
- CUDA内存模型
- CUDA内存层次结构
- 寄存器
- 共享内存
- 本地内存
- 常量内存
- 纹理内存
- 全局内存
toc: true
date: 2018-04-28 22:28:08


Abstract: 本文介绍CUDA编程的内存模型个概述,主要讲解CUDA包含的几种内存,以及各种内存的主要特点和用途,这篇作为内存部分地图一样,指导我们后面的写作和学习。

Keywords: CUDA内存模型,CUDA内存层次结构,寄存器,共享内存,本地内存,常量内存,纹理内存,全局内存

开篇废话

废话少说,我们直接进入主题,如果说我进入写程序的行业的印象最深刻的一本书,看过我博客的人应该能猜到,我也不止一遍的向大家推荐过《深入理解计算机系统》那本书告诉了我基本所有的计算机基础知识,编程基础知识,真的很基础,里面有CPU结构,内存管理模型,汇编等等,从知识层次来讲,非常偏底层,但是难度确实够让人难受,那本书,我估计我只看了一半,看懂的应该有一半的三分之二,也就是我只看懂了全书的三分之一,推荐有时间一定要看看,内存访问和管理是程序效率的关键点,高性能计算更是如此,上一篇举得例子关于运输原材料的例子,就是我们平时天天遇到的问题,我们希望有大量的高速度的大容量内存可以给我们的工厂(GPU核心)输送数据,但是根据我们目前的技术,大容量高速的内存不仅造价高,而且不容易生产,到目前为止(2018年5月)计算结构还是普遍采用内存模型获得最佳的延迟和带宽。

下面我们要看一条新闻,昨天还是前天看到的,刚才又搜了一下,效果大概是这样的


为了方便大家多年后理解时代背景:三周前,美国商务部制裁中兴公司(中兴公司倒闭了,你可以去查查Google)七年不允许美国公司向中国出售任何芯片类产品,中国人说这是贸易战,但是美国没说什么,直说制裁中兴公司。

新文内容是这样的:

我们把这个截图放在这,看看明年后年能不能上市,如果成功了,我算是松了口气,毕竟当年立的亩产三万八千斤的Flag到现在还没实现。
CUDA也采用的内存模型,结合了主机和设备内存系统,展现了完整的内存层次模型,其中大部分内存我们可以通过编程控制,来使我们的程序性能得到优化。
如果你之前写的程序都没怎么管理过内存,那请先练习下C语言,可能会有更好的理解。

内存层次结构的优点

程序具有局部性特点,包括:

  1. 时间局部性
  2. 空间局部性

解释一下,时间局部性,就是一个内存位置的数据某时刻被引用,那么在此时刻附近也很有可能被引用,随时间流逝,该数据被引用的可能性逐渐降低。

空间局部性,如果某一内存位置的数据被使用,那么附近的数据也有可能被使用。

现代计算机的内存结构主要如下:

这个内存模型在程序局部性原则成立的时候有效。学习过串行编程的人也应该知道内存模型,速度最快的是寄存器,他能和cpu同步的配合,接着是缓存,在CPU片上,然后是主存储器,现在常见的就是内存条,显卡上也有内存芯片,然后是硬盘,这些内存设备的速度和容量相反,越快的越小,越慢的越大。
局部性是个非常有趣的事情,首先局部性的产生并不是因为设备的原因,而是程序从一开始被编写就有这个特征,与生俱来,所以当我们发现此特征后,就开始设计满足此特征硬件结构,也就是内存模型,当内存模型设计成如上结构的时候,如果你想写快速高效的程序,就要让自己的程序局部性足够好,所以这就进入了一个死循环,最后为了追求高效率,设备将越来越优化局部性,而程序也会越来越局部化。
总结下最后一层(硬盘磁带之类的)的特点:

  • 每个比特位的价格要更低
  • 容量要更高
  • 延迟较高
  • 处理器访问频率低

CPU和GPU的主存都是采用DRAM——动态随机存取存储器,而低延迟的内存,比如一级缓存,则采用SRAM——静态随机存取存储器。虽然底层的存储器延迟高,容量大,但是其中有数据被频繁使用的时候,就会向更高一级的层次传输,比如我们运行程序处理数据的时候,程序第一步就是把硬盘里的数据传输到主存里面。
GPU和CPU的内存设计有相似的准则和模型。但他们的区别是:CUDA编程模型将内存层次结构更好的呈献给开发者,让我们显示的控制其行为。