Chinaunix

标题: 测试cpu的cacheline大小对于数组操作性能影响,不符合预期 [打印本页]

作者: cdsfiui    时间: 2017-04-22 20:18
标题: 测试cpu的cacheline大小对于数组操作性能影响,不符合预期
本帖最后由 cdsfiui 于 2017-04-23 10:48 编辑

书上说x86的缓存行默认是64字节,所以我有下面的测试代码:

  1. #include<sys/time.h>
  2. #include<stdlib.h>
  3. #include<stdio.h>
  4. size_t cacheline=16;
  5. int main(int argc,char*argv[]){
  6.     size_t loopCount=2000000000;
  7.     if(argc==2){loopCount=atol(argv[1]);}
  8.     printf("loop=%ld\n",loopCount);
  9.     int array[cacheline];
  10.     for(size_t a=0;a<cacheline;++a){
  11.         array[a]=a;
  12.     }
  13.     size_t c=0;
  14.     long sum=1;
  15.     for(size_t i=0;i<loopCount;++i){
  16.         if(c==cacheline)c=0;
  17.         sum+=array[c++];//array应该始终
  18.     }
  19.     printf("sum=%ld\n",sum);
  20.     return 0;
  21. }
复制代码

我期待的是,cacheline小于等于64的时候,int array这个数组会在操作的时候,全部缓存在同一个cacheline里面,性能没有变化。
而当大于64的时候,会有一次大幅度的降低。

但是我用了clang和gcc编译,结果发现不论是16,还是64,还是256,还是65536,结果都一样。无法理解。

  1. clang++ test07_cacheline.cpp -O2 -o test07_cacheline && time ./test07_cacheline 2000000000
复制代码

为什么cacheline这个参数的设定,对于性能的影响在我的程序里面没有体现出来? 求解释。

当cacheline=65536的时候,这个应该包含了很多个缓存行了吧,应该有很多cache invalidate发生? 但是我的测试结果还是没变啊
作者: cdsfiui    时间: 2017-04-23 10:48
自己顶一下
作者: 学到老lll    时间: 2017-06-30 10:58
帮你顶一下





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2