x86架构里的cache

来源:互联网 发布:mac文件导入移动硬盘 编辑:程序博客网 时间:2024/04/28 07:55


转载地址:http://blog.csdn.net/panzhenjie/article/details/17589991

首先来一张x86文档里关于cache类型的表格,一共有6种可以设置。


1. UC,是最容易理解的,就是不用cache机制,读是直接从内存中读,写是直接写到内存里去。对于一些硬件寄存器,通常采用这种配置,因为寄存器的值是可以在CPU控制之外变化的。还有就是用来做DMA传输的内存,也需要是UC的,原因同上,DMA controller会在CPU背后悄悄的修改内存,打开cache的话就会造成cache和内存的不一致。

2. UC-,不是特别理解和UC具体细微的区别,但大致上肯定是相同的。

3. WC,这是arm中没有的功能,只有在x86里实现。首先要明确的是,设置成WC之后,就和L1,L2,L3的cache没有任何关系了。在x86里,有另外一块存储区域叫WC buffer(通常是一个buffer是64字节大小,不同平台有不同数量个buffer)。设置成WC的内存,对其进行读操作和UC是一样的,直接从内存里读取,绕过cache。但是当对其进行写操作的时候,区别就来了。新的数据不会被直接写进内存,而是缓存在WC buffer里,等到WC buffer满了或者执行了某些指令后,WC buffer里的数据会一下子被写进内存里去。

4. WT,这个是很常见的属性。

读内存的时候:

假如cache已经有了这块内存(read hit),则直接从cache里返回数据。

假如cache里没有(read miss),则把这块数据从内存中加载到cache中去,再从cache里返回数据。

写内存的时候:

假如cache已经有了这块内存(write hit),则更新cache里的数据,并把修改更新到内存。

假如cache里没有(write miss):这里又要出来一个新的概念Write-Allocate和no Write-Allocate。在arm手册里是明确有这两个东西的,但是在x86的文档里我没有找到完全一样的东西,不清楚到底是怎么区分这两个概念的。

假如设置成Write-Allocate,就是先把更新写进内存,然后把内存加载到cache。

假如设置成no Write-Allocate,就会把更新直接写进内存,然后就结束了。

5. WB,这个也是很常见的属性。

读内存的时候:

假如cache已经有了这块内存(read hit),则直接从cache里返回数据。

假如cache里没有(read miss),则把这块数据从内存中加载到cache中去,再从cache里返回数据。

写内存的时候:

假如cache已经有了这块内存(write hit),则更新cache里的数据,但是不会写到内存里,直到这块cache被置换出去的时候才会被写进内存。

假如cache里没有(write miss):

假如设置成Write-Allocate,就是先把更新写进内存,然后把内存加载到cache。

假如设置成no Write-Allocate,就会把更新直接写进内存,然后就结束了。

虽然有WT Write-Allocate / WT no Write-Allocate / WB Write-Allocate / WB no Write-Allocate这四种搭配,但是其中有两种搭配的性能是不好的,我们逐一分析下:

WT Write-Allocate:WT的核心思想就是写的时候保证cache和内存的一致性。但是write miss的情况下,Write-Allocate会把内存加载到cache中去,对于后面很有可能到来的下一次写操作,性能上得不到任何的优化,反而和no Write-Allocate想比,多从内存中读取了N个字节的数据。

WB no Write-Allocate:WB的核心思想就是把修改攒在cache里,等到未来一起写进内存。但是write miss的情况下,no Write-Allocate会使得每次写动作都是需要直接操作内存的,而没有使能cache的功能,因此效率也是很低下的。

6. WP,这又是一个比较奇怪的属性。读的时候和WT,WB没有区别。但是写的时候就会直接写进内存,并使无效当前cache。


分析下这几种cache的应用场景:

UC和UC-上面已经说的比较详细了,主要是寄存器和DMA。

一般的内存,则最通用的时WB,因为性能最好。

WT的功能很明确,但是我还不太理解什么场景下用它会有比较好的性能。

WC一般用在framebuffer上,因为framebuffer大多是由CPU写内容进去,然后由display controll读出去。

所以对于CPU而言,大多都是写操作。WC相对UC的优势很明确,可以把多次的写集中成一次,提高效率。

那和WB比哪?同样也是有优势的。因为WB会把所有的framebuffer都加载到cache里去,不仅不能提高写的速度,还会冲掉很多有用的cache,造成性能的下降。

至于WP,不清楚具体的应用场景。


最后说说cache一致性的东西,在多核的系统里,一般L1的cache是独立的,即每个核都有自己单独的L1 cache。

假如某个核写更新了一块cache,要是在别的核的cache里也有这些数据,那不就不一样了?

x86里有个机制叫做snoop,即在这种情况下,一旦一块cache被更新,其他核的cache中相同的块会被使无效。

这样的话,其他核要访问这些数据的时候就要重新从内存中加载这些数据,从而达到了一致的效果。

0 0
原创粉丝点击