免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2225 | 回复: 2
打印 上一主题 下一主题

[Linux] 测试cpu的cacheline大小对于数组操作性能影响,不符合预期 [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-04-22 20:18 |只看该作者 |倒序浏览
本帖最后由 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发生? 但是我的测试结果还是没变啊

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
2 [报告]
发表于 2017-04-23 10:48 |只看该作者
自己顶一下

论坛徽章:
0
3 [报告]
发表于 2017-06-30 10:58 |只看该作者
帮你顶一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP