您的位置:首页 > 其它

存储器体系结构

2015-04-05 13:29 120 查看
对于一个刚开始搞超算的本科生来说,要是不懂存储器的体系结构,那当真是说不过去,今天详细地说一下计算机的存储结构吧。

存储技术

随机访问存储器

随机访问寄存器(RAM)分为两类:静态的和动态的。静态(SRAM)比动态(DRAM)更快,但也贵的多(不过搞超算的其实不太考虑贵不贵了)。所以一般SRAM用作高速缓存,而DRAM一般用作计算机的主存储器,也就是我们平时所说的内存了。还有就是DRAM可以用作图形系统的帧缓冲区,相信做过cuda编程的同学对这个肯定不陌生吧。


静态RAM

SRAM将每个位存储在一个双稳态的存储单元里,每个单元是用一个六晶体管电路来实现的。双稳态也就是它可以无限期地保持在两个不通过的电压或状态之一。所以它的抗干扰能力非常强。


动态RAM

DRAM每一位存储单元是由一个电容和一个访问晶体管组成(难怪比SDRAM便宜),它对干扰非常敏感。当电容和电压被扰乱以后,它永远也不会再恢复,暴露在光线下会导致电容和电压的改变。
很多原因会导致漏电,所以DRAM单元在10~100微秒的时间内失去电荷。所以存储系统必须周期性地读出,然后重写来刷新存储器的每一位。


传统的DRAM

磁盘存储

磁盘的盘片中央有一个可以旋转的主轴,它使得盘片以固定的旋转速率旋转,通常5400-15000转每分钟。
磁盘表面有一个称为磁道的同心圆组成的。每个磁道被划分为一组扇区。每个扇区包含相等数量的数据位(通常是512字节)扇区之间由一些间隙分隔开,这些间隙中不存储数据位。间隙存储用来标识扇区的格式化位。
磁盘制造商通常用术语柱面来描述多个盘片驱动器的构造。


磁盘容量

一个磁盘上可以记录的最大位数被称为最大容量。
记录密度:磁道一英尺可以放入的位数。
磁道密度:从磁盘中心出发半径上一英尺的段内可有的磁道道数。
面密度:记录密度和磁道密度的乘机。
现在大容量磁盘使用一种多区记录的技术,在这种记录中,柱面的集合被分割成不相交的子集,称为记录区。一个区中的每个柱面中的每条磁道都有相同数量的扇区。该扇区的数量是由该区中最里面的磁道上的扇区数量决定的。


磁盘容量的计算方法:

磁盘容量=字节数/扇区平均扇区数/磁道 磁道数/表面 * 表面数/盘面 * 盘片数/磁盘

磁盘读写

将驱动器磁头定位在磁道上被称为寻道。读写头垂直排列,任意时刻所有读写头都位于同一柱面上。磁盘以扇区大小的快块来读取数据
寻道时间
旋转时间
传送时间
因为寻道时间和旋转时间基本时相同的,所以可以将寻道时间乘以二是估计磁盘访问时间的合理方法。


连接到I/O设备

Intel的外围设备互联PCI,诸如PCI这样的I/O总线设计成与底层cpu无关。

usb控制器

图形卡

主机总线适配器是将一个或多个磁盘连接到I/O总线上。使用的一个特别的主机总线接口定义的通信协议。两个最常用的磁盘接口是SCSI和SATA,前者贵,速度快且能支持多个磁盘驱动器。

访问磁盘

CPU使用一种存储器映射I/O的技术来向I/O设备发出命令,地址空间有一块空降是为了I/O设备通信保留的。每个这样的地址称为I/O端口。当一个设备连接到总线时,它与一个或多个端口相关联。

设备可以自己执行读或者写总线事务,这个过程称为直接存储器访问,这种数据传输称为DMA传送。

在DMA完成以后,磁盘扇区的内容被安全地存储在主存中之后,磁盘控制器会发送一个中断信号给CPU。磁盘控制器把一个中断信号发送到CPU的一个引脚上。这会导致CPU中断当前的工作,跳转到一个操作系统例程。这时CPU会记录下I/O已经完成,然后将控制返回到CPU中断的地方。

固态硬盘

SSD顺序读写性能相当,当以随机顺序访问逻辑块时,读比写快一个数量级。SSD是基于闪存的,而一个闪存是由B个块组成,而一个块又是由p个也组成,其中一个页有512B~4KB,一个块有32~128个页组成。数据是以页为单位进行读写的。只有在一页所属的块被擦除以后,才能写这一页。不过一旦一个块被擦除了之后,块中的每一个页都可以不需要擦除就进行写一次。大约进行了100000次重复写之后,块就会磨损,一旦块磨损了,块就不能再用了。


局部性

局部性原理:程序倾向于引用邻近于它最近引用过的数据项的数据项,或者最近引用过的数据项本身。

两种形式:时间局部性 和空间局部性 在一个具有良好时间局部性的程序中,被引用过一次的存储器位置很可能在不远的将来再被多次引用。在一个具有良好空间局部性的程序中,如果一个存储器位置被引用一次,那么程序很可能在不远的将来引用附近的存储器位置。

int sumvec(int v
)
{
int i,sum=0;
for(i=0;i<N;i++)
{
sum+=v[i];
}
}


如下面这段代码可以知道,这段代码中sum具有良好的时间局部性,而数组V具有良好的空间局部性。该函数中访问v的每个元素具有步长为一的引用模式。步长为一的引用模式是程序空间局部性常见和重要的来源。一般而言,随着步长的增加,空间局部性下降。

取指令的局部性

代码区别于程序数据的一个重要属性在于CPU不会改变代码的值。

对于取指令来说循环具有良好的空间局部性和时间局部性。循环体越小,循环次数越少,局部性越好。

存储器的层次结构

寄存器 L1高速缓存,L2高速缓存,L3高速缓存,主存,本地磁盘,远程二级存储依次组成了计算机系统的体系结构。

缓存命中

当程序需要第k+1层的某个数据对象d时,它首先到底k层去查找d,如果第k层刚好有d,那么我们就称缓存命中。当缓存不命中时,程序会到第k+1层去找,如果第k层已经满了,就会牺牲第k层的一个块,有两种方法,一种是随机替换策略,一种是LRU替换策略,就是选取一个最后被使用离现在最远的块。

缓存不命中的种类

冷不命中:空的缓存有时称为冷缓存,那么对任何数据对象的访问都不会命中了。

放置策略:随机放置策略用硬件来实现,非常昂贵,一般只会在靠近CPU处来实现。

所以一般采用更加严格的放置策略,这样会导致冲突不命中

当工作集的大小大于缓存的容量时,会导致容量不命中,换句话说就是缓存太小了,没办法放下整个工作集。

高速缓存存储器

L1高速缓存:2~4个时钟周期

L2高速缓存:10 个时钟周期

L3高速缓存:30-40个时钟周期

通用的高速缓存存储器结构

一个高速缓存被组织成S组,每组E行,每行B个字节。
每一组只有一行的高速缓存被称为直接映射高速缓存。
高速缓存确定一个请求是否命中,然后抽取出这个字的过程分为3步:1组选择,2 行匹配,3字抽取


直接映射高速缓存中的冲突不命中

float dotprod(float x[8],float y[8])
{
float sum=0;
int i;
for(i=0;i<8;i++)
sum+=x[i]*y[i];
return sum;
}


对于x和y来说,这个函数有良好的空间局部性,并且有较高的命中率。但是并不总是如此。

但是有可能实际后面每一次对x和y的引用都会导致冲突不命中,因为我们在x和y之间的块抖动。

为什么用中间位作索引

如果用高位作索引,那么一些连续的存储器块就会映射到相同的高速缓存行。如果一个程序有良好的空间局部性,那么在任何时刻高速缓存中只保存着一个块大小的数组空间,这对高速缓存是一个浪费。

组相连高速缓存

组相连高速缓存行匹配的基本思想是组中任何一行都可以包含任何映射到这个组中的存储器块。所以高速缓存必须搜索组中的每一行,寻找一个有效的行,其标记和地址中的标记相匹配。如果找到了,那我们就命中了,然后根据偏移位找到要找的字。

缓存不命中的替换策略,一是随机替换,二是最不常使用策略LFU,三是最近最少使用策略LRU。

越往层次结构下面走,远离CPU,一次不命中的开销会变得更加昂贵。

全相连高速缓存

一个全相连高速缓存是由一个包含所有高速缓存行的组组成的。因为高速缓存电路必须并行地搜索许多相匹配的标记,构造一个又大又快的相连高速缓存很困难,而且很昂贵。因此,全相连高速缓存只适合做小的高速缓存,例如虚拟存储器系统中的翻译备用存储器TLB。

有关写的问题

写命中以后写入低一层的存储器有两种方法,一种是直写,另外一种是写回,即等到需要执行替换策略时,再将高速缓存中更新过的行写回到下一层的存储器中。这样可以显著减小总线的流量。但此时高速缓存必须为每一个缓存行维护一个修改位,以确定该行是否修改过了。

当缓存不命中时,一种是将相应的行取到高速缓存中,然后对其进行更新,然后写回,这种被称为写分配,还有一种是非写分配的,即直接写到低一层的存储器,一般直写都是非写分配的,写回高速缓存都是写分配的。

写回和写分配试图利用局部性,所以我们可以在更高层次上开发我们的程序,使其具有更高的时间和空间局部性。

Intel core i7的所有高速缓存都在CPU芯片上。且其L1高速缓存的指令缓存和数据缓存是分开的。指令缓存i-cache,数据缓存d-cache。

综合分析高速缓存

高速缓存的大小,一方面高速缓存大能增大高速缓存的命中率,但是当高速缓存增大时却又会增大命中时间,特别是L1高速缓存必须要快。

传统上,努力争取时钟频率的高性能系统会为L1高速缓存选择较低的相联度,而在处罚比较高的低层次上使用比较高的相联度。在Intel core i7 的L1,L2上是使用8路组相联的,而在L3上是使用16路组相联的。

编写高速缓存友好的代码

两个原则:

对局部变量的反复引用是好的,因为编译器能够将它们缓存在寄存器文件中(时间局部性)。

步长为1的引用模式是好的,因为编译器层次结构中所有层次上的缓存都是将数据存储在连续的块中(空间局部性)。

综合

Core I7具有硬件预取机制,它会自动地确定存储器的引用模式,试图在一些块被访问之前将它们取到高速缓存中。

存储器性能不是一个数字就能描述的,相反的,它是一座空间和时间局部性的山。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  体系结构