2019独角兽企业重金招聘Python工程师标准>>>

Valgrind为一个debugging 和 profiling的工具包,检查内存问题只是其最知名的一个用途。今天介绍一下,valgrind工具包中的cachegrind。关于cachegrind的具体介绍,请参见valgrind的在线文档http://www.valgrind.org/docs/manual/cg-manual.html

下面使用一个古老的cache示例:

#include <stdio.h>

#include <stdlib.h>

#define SIZE 100

int main(int argc, char **argv)

{

int array[SIZE][SIZE] = {0};

int i,j;

#if 1

for (i = 0; i < SIZE; ++i) {

for (j = 0; j < SIZE; ++j) {

array[i][j] = i + j;

}

}

#else

for (j = 0; j < SIZE; ++j) {

for (i = 0; i < SIZE; ++i) {

array[i][j] = i + j;

}

}

#endif

return 0;

}

这个示例代码从很久就开始用于说明利用局部性来增加cache的命中率。传统的是第一个for循环的性能要优于第二个循环。

我使用条件编译,在没有打开任何优化开关的条件下,第一种情况生成文件为test1,第二种情况生成文件为test2。

下面是输出

[fgao@fgao-vm-fc13 test]$ valgrind --tool=cachegrind ./test1

==2079== Cachegrind, a cache and branch-prediction profiler

==2079== Copyright (C) 2002-2009, and GNU GPL'd, by Nicholas Nethercote et al.

==2079== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info

==2079== Command: ./test1

==2079==

==2079==

==2079== I refs: 219,767

==2079== I1 misses: 614

==2079== L2i misses: 608

==2079== I1 miss rate: 0.27%

==2079== L2i miss rate: 0.27%

==2079==

==2079== D refs: 124,402 (95,613 rd + 28,789 wr)

==2079== D1 misses: 2,041 ( 621 rd + 1,420 wr)

==2079== L2d misses: 1,292 ( 537 rd + 755 wr)

==2079== D1 miss rate: 1.6% ( 0.6% + 4.9% )

==2079== L2d miss rate: 1.0% ( 0.5% + 2.6% )

==2079==

==2079== L2 refs: 2,655 ( 1,235 rd + 1,420 wr)

==2079== L2 misses: 1,900 ( 1,145 rd + 755 wr)

==2079== L2 miss rate: 0.5% ( 0.3% + 2.6% )

[fgao@fgao-vm-fc13 test]$ valgrind --tool=cachegrind ./test2

==2080== Cachegrind, a cache and branch-prediction profiler

==2080== Copyright (C) 2002-2009, and GNU GPL'd, by Nicholas Nethercote et al.

==2080== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info

==2080== Command: ./test2

==2080==

==2080==

==2080== I refs: 219,767

==2080== I1 misses: 614

==2080== L2i misses: 608

==2080== I1 miss rate: 0.27%

==2080== L2i miss rate: 0.27%

==2080==

==2080== D refs: 124,402 (95,613 rd + 28,789 wr)

==2080== D1 misses: 1,788 ( 621 rd + 1,167 wr)

==2080== L2d misses: 1,292 ( 537 rd + 755 wr)

==2080== D1 miss rate: 1.4% ( 0.6% + 4.0% )

==2080== L2d miss rate: 1.0% ( 0.5% + 2.6% )

==2080==

==2080== L2 refs: 2,402 ( 1,235 rd + 1,167 wr)

==2080== L2 misses: 1,900 ( 1,145 rd + 755 wr)

==2080== L2 miss rate: 0.5% ( 0.3% + 2.6% )

结果有点出人意料,第一种情况在D1的命中率反而低于第二种情况。

这个结果其实是应该可以理解的。

1. 现在的CPU的cache是以line为单位的。这样,当数组的size不大时,第二种情况的循环,虽然没有使用局部性原则,但是并不会因此降低cache的命中率,并且可能可以迅速的将数据填到cache中

2. 现在的CPU的cache空间较大。这样,当数组的size不大时,即使没有使用局部性原则,也不会导致cache的频繁更新。

由于我对cache的理解,也比较粗浅,所以不能明确的指出这个结果的根本原因。根据上面的两个条件,基本上也可以理解为什么第二种情况更快。

为了使cachegrind的结果与传统的一样,我们就需要破坏上面两个条件。那么,现在将SIZE从100增大的1000。再次看一下输出结果:

[fgao@fgao-vm-fc13 test]$ valgrind --tool=cachegrind ./test1

==2094== Cachegrind, a cache and branch-prediction profiler

==2094== Copyright (C) 2002-2009, and GNU GPL'd, by Nicholas Nethercote et al.

==2094== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info

==2094== Command: ./test1

==2094==

==2094==

==2094== I refs: 11,519,463

==2094== I1 misses: 617

==2094== L2i misses: 611

==2094== I1 miss rate: 0.00%

==2094== L2i miss rate: 0.00%

==2094==

==2094== D refs: 7,305,498 (6,038,310 rd + 1,267,188 wr)

==2094== D1 misses: 125,791 ( 621 rd + 125,170 wr)

==2094== L2d misses: 125,763 ( 595 rd + 125,168 wr)

==2094== D1 miss rate: 1.7% ( 0.0% + 9.8% )

==2094== L2d miss rate: 1.7% ( 0.0% + 9.8% )

==2094==

==2094== L2 refs: 126,408 ( 1,238 rd + 125,170 wr)

==2094== L2 misses: 126,374 ( 1,206 rd + 125,168 wr)

==2094== L2 miss rate: 0.6% ( 0.0% + 9.8% )

[fgao@fgao-vm-fc13 test]$ valgrind --tool=cachegrind ./test2

==2095== Cachegrind, a cache and branch-prediction profiler

==2095== Copyright (C) 2002-2009, and GNU GPL'd, by Nicholas Nethercote et al.

==2095== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info

==2095== Command: ./test2

==2095==

==2095==

==2095== I refs: 11,519,463

==2095== I1 misses: 617

==2095== L2i misses: 611

==2095== I1 miss rate: 0.00%

==2095== L2i miss rate: 0.00%

==2095==

==2095== D refs: 7,305,498 (6,038,310 rd + 1,267,188 wr)

==2095== D1 misses: 1,063,300 ( 621 rd + 1,062,679 wr)

==2095== L2d misses: 116,261 ( 595 rd + 115,666 wr)

==2095== D1 miss rate: 14.5% ( 0.0% + 83.8% )

==2095== L2d miss rate: 1.5% ( 0.0% + 9.1% )

==2095==

==2095== L2 refs: 1,063,917 ( 1,238 rd + 1,062,679 wr)

==2095== L2 misses: 116,872 ( 1,206 rd + 115,666 wr)

==2095== L2 miss rate: 0.6% ( 0.0% + 9.1% )

对比红色的两行,第一种情况的miss率为1.7%,而第二种情况的miss率高达14.5%。现在符合了传统。

总结一下:

1. 我们可以使用cachegrind来检查cache的命中率,提高程序性能;

2. 尽信书不如无书。书中的一些结果面对现在的环境,很可能是错误的。毕竟IT技术更新太快。还是自己动手实践一下更好!

转载于:https://my.oschina.net/u/2408078/blog/513126

使用valgrind检查cache命中率相关推荐

  1. [存储器] 简述影响 Cache 命中率的因素

    简述影响 Cache 命中率的因素 摘要: 存储器是计算机的核心部件之一.由于 CPU 和主存在速度上的存在着巨大差 异, 现代计算机都在 CPU 和主存之间设置一个高速. 小容量的缓冲存储器 cac ...

  2. cache相关命中率的运算_Linux cache命中率查看

    一.需求与背景 LINUX主机上的内存很为user.buffer.cache这个大的块.经常在使用free -m查看时,会发现cache占去了大头,从理论上我们也一直都知道cache里存放的是系统上访 ...

  3. 有关cache命中率的问题

    参考资料:<计算机组成原理>(第五版) 白中英等著 有关cache命中率的问题可以说是玩文字游戏,别上当就行 一.相关概念以及公式: ①cache命中率: 在一个程序执行期间,设Nc表示c ...

  4. 计算机组成原理:cache命中率、平均访问时间、效率公式(精简)

    Nc表示cache完成存取总次数,Nm表示主存完成存取总次数,h表示 cache 命中率 h = Nc / ( Nc + Nm ) tc表示命中时的cache访问时间,tm表示未命中时的贮存访问时间, ...

  5. cache命中率、平均访问时间、访问效率的计算公式

    cache命中率.平均访问时间.访问效率的计算公式 cache命中率 平均访问时间 访问效率 使用cache可以提高计算机的性能,也提高了主存访问的效率

  6. 增加Cache命中率加快程序运行速度

    场景一:改变程序运行顺序以提高Cache命中率 给定代码逻辑:当条件A成立,则执行B:否则执行C. if (cond A) {// do sth. B } else {// do sth. C } C ...

  7. cache相关命中率的运算_计算机高速缓冲存储器(Cache)命中率的分析

    第 21 卷 第 3 期 河南教育学院学报( 自然科学版) Vol. 21 No. 3 2012 年 9 月 Journal of Henan Institute of Education ( Nat ...

  8. valgrind——Cachegrind分析CPU的cache命中率、丢失率,用于进行代码优化。

    功能扩展1 Cachegrind 1.1 指令范式 单行最重要指令: valgrind --tool= [default: memcheck] sun@sun:~/workspace/deptrum$ ...

  9. oracle libary cache 命中率

    原文出处 SQL> desc v$librarycache Name                                      Null?    Type ----------- ...

最新文章

  1. CMU 刘鹏飞:NLP的第四范式
  2. Git中pull,commit和push的概念
  3. 一位 CEO 在战略沟通会上的员工问答实录
  4. c/c++拷贝构造函数和关键字explicit
  5. [016]转--C++拷贝构造函数详解
  6. Java:IDEA下使用JUNIT
  7. 裁员30%?互联网行业裁员力度进前三 求职竞争加剧
  8. 无配置文件下使用log4net
  9. 动态表头_Excel制作动态考勤表及周六周日颜色标注
  10. 随机过程的概念以及统计特性(读书笔记)
  11. HTML链接会议申请,会议流程.html
  12. 使用Scrapy(二)编写抓取规则
  13. 第27月第25天 clang -rewrite-objc main.m
  14. python代码手机壁纸_python爬虫高清壁纸小白实战代码
  15. 查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率--及格为>=60,中等为:70-80,优良为:80-90,优秀为:
  16. 毕设新思路附源码 | 微医平台项目详细步骤
  17. office(如:Word、Excel、PPT 等)文件轻松实现在线预览
  18. 送30本曹大的《你凭什么做好互联网》
  19. win10能登微信 打不开网页
  20. 护卫神 mysql 升级_护卫神php套件 php版本升级方法(php5.5.24)

热门文章

  1. 如何使用AdminStudio软件把.exe转换成.msi
  2. 智·御未来 亚信安全巡展·2017即将起航
  3. POJ 2528 Mayor's posters 贴海报 线段树 区间更新
  4. rundeck 内存溢出
  5. Viliv N5 GPS安装及使用方法
  6. Q109:用PBRT渲染Blender导出的模型(3)
  7. 桶排序(bucket sort)
  8. 使用数据分析工具的注意事项
  9. 嵌入式商业智能BI有什么功能
  10. 汽油与消费需求问题的MonteCarlo求解方法