为什么要引入Cache
①大容量主存一般采用 DRAM,相对SRAM速度慢,而SRAM速度快,但价格高。
②程序和数据具有局限性,即在一个较短的时间内,程序或数据往往集中在很小的存储器地址范围内。
因此,在主存和CPU之间可设置一个速度很快而容量相对较小的存储器,如下图所示。在其中存放CPU 当前正在使用以及一个较短的时间内将要使用的程序和数据,这样,可大大加快 CPU 访问存储器的速度,提高机器的运行效率。
Cache其实是我们分出来的特定的存储器,为了优化处理器处理速度,Cache具有一些优秀的特点。事实上从引入理由可以看到Cache必须存储速度快并且不是那么大容量对于系统也会有很大帮助。寻找这样的存储器,SRAM简直是量身定做,该存储器采用晶体单元,集成度不高所以做不到容量大;但是它相比DRAM速度就快了,另外掉电后数据也保存,对于一些重复的应用而言第一次命中就很好了,似乎都不需要提前读写(预热)。既然Cache实质存储器,也应该满足存储器的层次结构。
存储器的层次结构
l
–
–
–
–
l
l
数据访问的局部特性(Cache代码优化)
l
–
l
–
内存Cache的设计
–
–
–
直接映射Cache:
–
–
l
l
l
l
l
l
l
字指针Offset设置(DM642)
设每次从Cache中取出一个字(B),L1P采用直接映射,也就是块大小等于行大小,所以块大小为32B=25B,所以需要5Bits来描述块内字偏移量。占据地址0-4低5位。
块指针Index设置
选择合适Cache行(叫做:Cache Row)
Cache大小:16 KB = 214 bytes
块大小: 25 bytes (8 words)
Cache行数 =
需要9bits第5-13位
标志位:剩余的位数为32-5-9=18Bits第14-31位
3类事件
l
l
l
Valid bit:标准Cache块是否有数据
Cache的性能
平均访问时间(Average Access Time )
= Hit Time +
未命中产生的原因:1)加载程序时,Cache里面还没有任何信息或数据有误;2)采用两个内存地址映射到同一Cache块(允许的),且同时访问;会产生冲突。(直接映射很容易导致冲突,因为概率上而言映射关系不多出错的可能性就大了?)。
Cache块大小
–
–
–
块大小对Cache性能指标的影响
–
–
要改善Cache的性能,可以通过两个途径实现,1)增加命中率,2)减少缺失开销
减少冲突可以有效增加命中率,让映射关系更自由可以降低冲突发生的概率,就可以增加命中率从而改善Cache性能,因此引入了全相关的概念,Index不再操作。内存地址单元可以映射到任意的Cache块。
有了全相关的概念自然的引出了多路联合集,每个集包含多个Cache块,集内是全相关的,必须并行比较Tag,集间相当于直接映射,直接映射到集,然后用全相关。
Cache的替换策略
如果所有可用Cache块都已经占用,新的程序/数据来到,必须废弃一个,然后存储在此处,这就是替换策略。
LRU(Least Recently Used)近来最少使用块,找一个最空闲的,存储新数据。
http://blog.sina.com.cn/s/blog_4a709f280100x1on.html
cache miss分为3个种类:
conflict miss
capacity miss
compulsory miss
Compulsory misses are those misses caused by the first reference to a location in memory. Cache size and associativity make no difference to the number of compulsory misses. Prefetching can help here, as can larger cache block sizes (which are a form of prefetching). Compulsory misses are sometimes referred to as cold misses.
Capacity misses are those misses that occur regardless of associativity or block size, solely due to the finite size of the cache. The curve of capacity miss rate versus cache size gives some measure of the temporal locality of a particular reference stream. Note that there is no useful notion of a cache being "full" or "empty" or "near capacity": CPU caches almost always have nearly every line filled with a copy of some line in main memory, and nearly every allocation of a new line requires the eviction of an old line.
Conflict misses are those misses that could have been avoided, had the cache not evicted an entry earlier. Conflict misses can be further broken down into mapping misses, that are unavoidable given a particular amount of associativity, and replacement misses, which are due to the particular victim choice of the replacement policy.