如何编写100% cache miss的C程序

转载 2013年12月05日 10:32:43

http://blog.csdn.net/qianlong4526888/article/details/12872819

今天为了做ppt讲解如何使用oprofile(以测试cache miss为例),要写一个cache miss的小例子,以Level 2 data cache为例,具体步骤见下文。

1、查看你的系统cache大小:

$ cat /sys/devices/system/cpu/cpu0/cache/index2/size

我的系统是centos 5.8。以上命令是查看Level 2cache的大小,在我的服务器上是256k,记住这个数,写程序时要用。

2、查看cache line的大小:

$ cat /sys/devices/system/cpu/cpu0/cache/index2/coherency_line_size

我的服务器上是64,单位是bytes,记住这个数,也要用到。


3、编写测试程序cache.c:

  1. int matrix[8192][16];   //4*8192*16=2^18=512k bytes 
  2.  
  3. void bad_access()                                                                                                                       
  4.     int k, j, sum = 0; 
  5.     for(k = 0; k < 16; k++) 
  6.         for(j = 0; j < 8192; j++) 
  7.             sum += matrix[j][k];  
  8.  
  9. int main() 
  10.     int i; 
  11.     for(i = 0; i< 5000000; i++) 
  12.         bad_access(); 
  13.     return 0; 

以上代码虽然简单,但要理解需要懂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就不再被替换,所以不会再发生cache miss,为了保证每次取数据都要发生cache miss,数组必须至少是cache大小的两倍及以上。

循环读取数组中的数据,每次读一个int大小,然后加64,再读取下一个cache line的数据,循环直到数组数据全部取出。

oprofile统计cache miss有个最低限制(我的0.9.8版本是2000000次),所以发生的miss数太小的话是娶不到的,所以加大循环次数至5000000。

4、至此可以进行100% cache miss的测试了,但是经过测试发现 cache miss压根没发生,百思不得其解,请教boss后才想起来,x86有个stream buffer硬件预取器,如果你取数据非常规律,那么硬件预取器经过训练后,会在你真正取数据之前,将你要的数据直接放到cache中。所以,要在至强处理器的服务器上做cache miss测试,必须重启系统后,关闭硬件预取器。否则就要修改程序,写出真正随机取数据的代码,但是这无法保证cache miss 率是100%,只能保证cache 命中率比较低而已。

5、SPEC CPU2006中的mcf发生cache miss rate很高,可以用其做测试。

 

相关文章推荐

C6000系列的C64x+ Cache优化--配置,Cache miss和Cache一致性

本文主要介绍TI C6000系列的C64x+的DSP Cache配置,常见的Cache miss模式以及如何在多核或者多外设DMA系统下维护Cache一致性,当然还有Cache优化的专题,针对指令L1...
  • yuyin86
  • yuyin86
  • 2012年05月08日 08:24
  • 1169

C6000系列的C64x+ Cache优化--配置,Cache miss和Cache一致性

本文主要介绍TI C6000系列的C64x+的DSP Cache配置,常见的Cache miss模式以及如何在多核或者多外设DMA系统下维护Cache一致性,当然还有Cache优化的专题,针对指令L1...
  • lcydhr
  • lcydhr
  • 2014年11月17日 08:29
  • 553

Global Cache Miss

最近数据库集群通过spotlight监控经常报一些警告:  global cache 总是有Miss的情况  Alarm raised  80.98 milliseconds latency ac...
  • jyjxs
  • jyjxs
  • 2013年04月01日 13:17
  • 848

CACHE的Miss和Hit

1.L1 CACHE的Miss和Hit 1.1 Read Miss 见2.1。 1.2 Write Miss L1D是Read-allocate CACHE,意味着仅在发生Read Miss时...

What happens when there is a cache miss?

cache misses : http://en.wikipedia.org/wiki/CPU_cacheA cache miss on an instruction fetch requires t...

C程序设计 谭浩强 100% 第三版 分卷1

  • 2010年09月12日 17:46
  • 15.26MB
  • 下载

一个简单的c程序,提取gem5运行benchmark产生的stats.txt中的l2cache的总不命中率

#include #include #define BufferLength 500 int isBufferContainsStr(char buffer[] , char str[] ,i...
  • wyj7260
  • wyj7260
  • 2012年12月29日 11:16
  • 1891

连载:编写高效代码(14) 程序、数据访问符合Cache的时间、空间局部性

Cache正是利用了程序、数据访问时的时间局部性和空间局部性,为了使Cache的访问效率最高,程序和数据的组织,也应该要符合这两个特性。最典型的例子就是二维数组的访问,下面就是一个二维数组: 二...

转载:多核环境下编写程序需注意cache

转载来自:http://blog.chinaunix.net/uid-14617649-id-3058621.html 前阵子接触到一道关于数组内部链表(多用于内存池技术)的数据结构的题, 这种...

编写高效代码(14) 程序、数据访问符合Cache的时间、空间局部性

Cache正是利用了程序、数据访问时的时间局部性和空间局部性,为了使Cache的访问效率最高,程序和数据的组织,也应该要符合这两个特性。最典型的例子就是二维数组的访问,下面就是一个二维数组: 二...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何编写100% cache miss的C程序
举报原因:
原因补充:

(最多只允许输入30个字)