注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

《深入理解计算机系统》笔记(二)  

2014-09-12 19:19:32|  分类: 学习录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

四、处理器体系结构

 -----------------这章是讲CPU的,搁到本书的末尾去读。

五、优化程序性能

1、存储器别名使用:两个指针可能指向同一个存储器位置的情况。这是妨碍编译器优化的因素。另一个优化因素是内联函数的替换。

2、消除循环的低效率,把循环内部的函数调用移出循环测试。消除不必要寄存机器的引用。

3、一个寄存器文件包含整数、浮点数和最近SSE寄存器,是退役单元的一部分,因为退役单元控制着这些寄存器的更新。


4、功能单元中的每个运算都是由两个周期计数值来刻画的:延迟,表示完成运算所需要的总时间;发射:表示两个连续的同类型运算之间需要的最小时钟周期数。大多数的加法和乘法运算发射时间为1,意思是在每个时钟周期,处理器都可以开始一条新的这样的运算。除法的延迟和发射时间是按范围值给出,因为某些被除数和除数的组合比其他的组合需要更多的步骤。在Core i7中,整数乘法、浮点数乘法和加法是最重要的操作,为了获得低延迟和较高的流水线化程度需要大量的硬件。

5、循环展开,通过增加每次迭代计算的元素数量,减少循环的迭代次数。把循环分开,例如分为第一个循环每次处理两个元素,第二个循环处理一个元素的方式处理向量的最后几个元素。但是这种展开只是对整数加法和乘法有所改进,而对浮点数运算没改进。拿乘法来说,每条mulss指令被翻译成两个操作:从寄存器中加载一个数组元素;把这个值乘以已有的累计值。而展开之后,虽然每次迭代次数减半了,但是循环中还是有两个顺序的乘法操作。

6、提高并行性:即把在循环展开的基础上,进行并行计算,可把结果分为奇数次和偶数次并行计算。

7、加载:从存储器读到寄存器中。存储:从寄存器写到存储器中。

   存储的性能,/读相关:一个存储器读的结果依赖于一个最近的存储器写。

void write_read(int *src,int *des,int n){

   int cnt=n;

   int val=0;

   while(cnt--){

*des=val;

val=(*src)+1;

   }

}

当传入的实参都是指向数组a[0]的时候,从a[0]中读出的值通过val=(*src)+1;语句改变*des的值,那么val变量也会在本次循环中改变。第一次循环,首先把0写入a[0]中,紧接着,val就会变成1,因为此时*src也是0了,...,这就是写/读相关。

六、存储器层次结构

1、随机访问存储器:有静态的SRAM和动态DRAMSRAM双稳态特性。DRAM一般用d*wDRAM表示,d个超单元,每个超单元有wDRAM单元。DRAM芯片的信息通过引脚的外部连接器流入和流出芯片,每个引脚携带一个1位的信号。

2、存储器模块:常见的是168个引脚的双列直插存储器模块。要取存储器地址A处的一个64位双字,存储控制器将A转换成一个超单元地址(i,j),并将它发送到存储器模块,然后存储器模块再将ij广播到每个DRAM,作为响应,每个DRAM输出它的(i,j)超单元的8位内容。现在大多数系统都是用DDR3 SDRAM(双倍数据速率同步 DRAM),Core i7只支持此方式。

3、步长为1的引用模式,是针对对程序数据引用的空间局部性良好表现,步长越大,空间局部性就会下降。;重复引用同一变量的程序有良好的时间局部性。

4、存储器层次结构CPU寄存器 -> 基于SRAML1/L2/L3高速缓存 -> 主存DRAM 主存 -> 本地磁盘 -> 远程二级存储。


5、高速缓存cache,第k层的存储器缓存了第k+1层的一个映射子集。

   缓存命中:在第k层就找到了需要的数据。找不到则成为缓存不命中。

   缓存不命中有冷不命中和冲突不命中。冷不命中:空的缓存也就是冷缓存,发生了不命中就要执行某个放置策略。冲突不命中:缓存足够大,但是对象映射到了同一个缓存块,导致一直命不中。

6、高速缓存S,E,B,m)的通用组织,是一个高速缓存组的数组,每个组S包含一个以上的行E,每个行包含一个有效位、一些标记位以及一个数据块B,将m个地址划分为t个标记位、s个组索引位和b个块偏移位。

7、直接映射(E=1)高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程,有三步:组选择,行匹配,字抽取。

   组选择:从w的地址中间抽取出s个组索引位,这些位被解释为一个对应的一个组号的无符号整数。

   行匹配:因为只有一行,而标记和块中的位是有意义的,且相匹配,可以直接命中。

   字抽取:块偏移中的字节偏移。

   标记位和索引位连起来唯一地标识了存储器中的每个块。当有多个存储器块,而缓存组不多时,则根据散列表进行映射。直接映射高速缓存的4位地址空间:《深入理解计算机系统》笔记(二) - mihooke - mihooke的博客

8、组相连高速缓存中的行匹配和字选择,重要思想就是组中的任何一个行都可以包含映射到这个组的存储器块。先判断有效位是否已设置了,再判断某一行的标记位是否匹配地址中的标记位,如果都匹配则命中。

假设地址的宽度是13个字节,引用地址0x0E34

《深入理解计算机系统》笔记(二) - mihooke - mihooke的博客

那么高速缓存块偏移地址就是:0x0

    高速缓存组索引是:0x5

    高速缓存标记是:0x71

这三个地址数据就可以判定是否是命中了。利用缓存内容,还可以知道缓存的字节。

9、高速缓存实际上保存数据和指令,只保存指令的高速缓存称为i-cache,它通常是只读的;只保存数据的称为d-cache。现代处理器包含独立的i-cached-cache

10、高速缓存友好代码:对局部变量的反复引用是好的,因为编译器能够将它们缓存在寄存器文件中;步长为1的引用模式是好的,因为存储器层次结构中所有层次上的缓存都是将数据存储为连续的块。

11、存储器山形象地从时间局部性和空间局部性描述了存储器系统的性能,它的目标是利用时间局部性使得频繁使用的字从L1取出;利用空间局部性使得尽可能多的字从一个L1高速缓存行中访问到。

12、矩阵乘法的六种形式:当CPU按行对二维数组操作时,将访问连续地址的主存单元,因此当cache访问不命中时,从主存调入到cache中某一块的数据将全部是CPU将要访问的有效数据,使得后继cache的命中率可以达到很高。如果CPU按列对二维数组进行操作,将跳跃式第访问地址不连续的主存单元,因此,当cache失效时,从主存调入到cache中某一块数据的大部分并不是CPU将要访问的数据,导致cache的命中率很小,尤其是当二维数组比较大时(数组的一行或一列大于cache的一块),cache命中率几乎为0

  评论这张
 
阅读(92)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017