ARM cache miss-match test (C++ Code)

来源:互联网 发布:淘宝没有退款选项 编辑:程序博客网 时间:2024/05/05 20:41
  1. //观察因为Cache未命中引起的程序执行速度变化
  2. //  传入参数, int型缓冲区指针,大小必须大于2*64*256 bytes
  3. //  里面的几个常量的值源自ARM920T的Cache结构
  4. void cache_miss_control(int *buf)
  5. {
  6.     long tm;            //起始时间
  7.     long total;         //运行时间
  8.     int dumb;           //固定的写入目标地址
  9.     //cache size = 16KB
  10.     const int cache_size = 16*1024;
  11.     //cache line size = 32B
  12.     const int cache_line_size = 32;
  13.     //Cache共享区域(64路)
  14.     const int cache_share_line_cnt = 64;
  15.     //完全独立的内存区域尺寸 = 256B
  16.     const int cache_independent_zone = (cache_line_size*(cache_size/(cache_line_size*cache_share_line_cnt)));
  17.     //内层运算量4096次
  18.     const int calc_cap = 4096;
  19.     int loop, xx, yy, i, j;
  20.     int *p;
  21.     for(xx= 2*cache_share_line_cnt; xx >= 1; --xx)                  //改变内层循环步长,控制对Cache项目更新的数量
  22.     {
  23.         yy = calc_cap/xx;                                           //保证运算量不变
  24.         if(yy*xx != calc_cap) continue;
  25.         SetTimeMark(tm);                                           //计时开始
  26.         for(loop = 0; loop<1024*4; ++loop)                          //延时
  27.         {
  28.             for(i = 0; i<yy; ++i)                                   //外层循环
  29.             {
  30.                 p = buf;
  31.                 for(j = 0; j<xx; ++j)                               //内层循环
  32.                 {
  33.                     dumb = *p;
  34.                     p += (cache_independent_zone)/sizeof(int);      //p指针的步长保证总是访问同一组64路Cache区域
  35.                 }
  36.             }
  37.         }
  38.         total = GetElapseTime(tm);                                  //打印计时结果
  39.         printf("takes %ld(uS)!(inner loop = %d)/n", total, xx);
  40. }
  41. }
  42. /*
  43. 结果:(这个结果我无法解释,本来是期待在inner loop 接近64的时候会观察到速度的逐渐降低的,谁能分析这段代码,在下感激不尽...)
  44. takes 378484(uS)!(inner loop = 1)
  45. takes 273772(uS)!(inner loop = 2)
  46. takes 220790(uS)!(inner loop = 4)
  47. takes 194486(uS)!(inner loop = 8)
  48. takes 181388(uS)!(inner loop = 16)
  49. takes 174774(uS)!(inner loop = 32)
  50. takes 171456(uS)!(inner loop = 64)
  51. */


 

原创粉丝点击