
查看你的系统cache大小:$ cat /sys/devices/system/cpu/cpu0/cache/index2/size以上命令是查看Level 2cache的大小,在服务器上是256k,记住这个数,写程序时要用。看cache line的大小:$ cat /sys/devices/system/cpu/cpu0/cache/index2/coherency_line_size编写测试程序cache.c:以上代码虽然简单,但要理解需要懂cache的简单结构及原理:cache是以64字或者128字节为一行的,分为多组(或者叫多路),每次发生cache miss取数据时,cache按照cache line为单位(这里也就是一次取64字节)从内存取数据。第一步得知level 2 data cache总大小是256k,第二步得到每个cache line是64字节,所以,level2 data cache共256k/64=2^12=4096行。想象一个表,每行64字节,一共4096行,共256k大小,这就是我们cache的简单结构。为了保证每次取数据都会发生miss,我们必须以>=64字节的步长取数据。首先创建一个512K大的数组,要比cache大一倍。如果数组也是256k,当第一次循环结束,数组用完后再次从头开始取数据时,cache就不再被替换,所以不会再发生cachemiss,为了保证每次取数据都要发生cache miss,数组必须至少是cache大小的两倍及以上。循环读取数组中的数据,每次读一个int大小,然后加64,再读取下一个cache line的数据,循环直到数组数据全部取出。oprofile统计cache miss有个最低限制(我的0.9.8版本是2000000次),所以发生的miss数太小的话是娶不到的,所以加大循环次数至5000000。至此可以进行100% cachemiss的测试了,但是经过测试发现 cache miss压根没发生,百思不得其解,请教boss后才想起来,x86有个streambuffer硬件预取器,如果你取数据非常规律,那么硬件预取器经过训练后,会在你真正取数据之前,将你要的数据直接放到cache中。所以,要在至强处理器的服务器上做cachemiss测试,必须重启系统后,关闭硬件预取器。否则就要修改程序,写出真正随机取数据的代码,但是这无法保证cachemiss 率是100%,只能保证cache 命中率比较低而已。SPEC CPU2006中的mcf发生cache miss rate很高,可以用其做测试。
索引和偏移量cache块大小计算方法是:为Cache中的每个块位置分配一个索引字段,用Tag字段区分存放在Cache位置上的不同的块。
单路直接映像把主存储器分成若干页,主存储器的每一页与Cache存储器的大小相同,匹配的主存储器的偏移量可以直接映像为Cache偏移量。Cache的Tag存储器(偏移量)保存着主存储器的页地址(页号)。在全相联Cache中,存储的块与块之间。
以及存储顺序或保存的存储器地址之间没有直接的关系。程序可以访问很多的子程序、堆栈和段,而它们是位于主存储器的不同部位上。Cache保存着很多互不相关的数据块,Cache必须对每个块和块自身的地址加以存储。
当请求数据时,Cache控制器要把请求地址同所有地址加以比较,进行确认,这种Cache结构的主要优点是,它能够在给定的时间内去存储主存器中的不同的块,命中率高;缺点是每一次请求数据同Cache中的地址进行比较需要相当的时间,速度较慢。
扩展资料:
在实模式中,内存比保护模式中的结构更令人困惑。内存被分割成段,并且 *** 作内存时需要指定段和偏移量。段-寄存器这种格局是早期硬件电路限制留下的一个伤疤。地址总线在当时有20-bit。然而20-bit的地址不能放到16-bit的寄存器里。
这意味着有4-bit必须放到别的地方。因此为了访问所有的内存必须使用两个16-bit寄存器。这一设计上的折衷方案导致了偏移量格局。最初的设计中其中一个寄存器只有4-bit有效,然而为了简化程序,两个寄存器都是16-bit有效,并在执行时求出加权和来标识20-bit地址。
参考资料来源:百度百科-Cache结构
参考资料来源:百度百科-偏移量
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)