Valgrind Cachegrind CPU缓存 - B站视频详解

🎬 B 站视频链接:Valgrind 工具实战讲解 - Cachegrind 篇

🎬 B 站视频详解:Valgrind 工具实战讲解 - Cachegrind 篇

Valgrind 中 cachegrind 工具全面解析:性能优化的第一步

这是一篇完整的讲解文档,带您深入理解 Valgrind 中的 cachegrind 工具。旨在让您明白 CPU 缓存的基本原理,以及如何利用 cachegrind 完成实际性能分析和优化。


一、什么是 CPU 缓存?

在现代 CPU 设计中,缓存是一种很小、非常快速的内存,作为 CPU 和一般内存之间的中间层。

通常分为三级:

  • L1 :最小最快
  • L2 :大一些,速度慢一些
  • L3 :共享,速度最慢,容量最大

如果缓存未命中(即所谓 cache miss),CPU 需要从内存中重新读取数据,这会引起性能降低。

因此,使用有利于缓存命中率的数据访问模式,是性能优化的重要手段。


二、什么是 Valgrind?

Valgrind 是一套经典的 Linux 下的性能调试和错误分析工具集,提供多种工具:

  • memcheck:内存错误检测
  • cachegrind:缓存和分支预估分析
  • callgrind:函数调用分析
  • helgrind:线程纠缠检测

我们本文要看的,是其中的 cachegrind

在这里插入图片描述


三、cachegrind 是什么?能做啥?

cachegrind 是一个可以模拟 CPU 中缓存行为的工具,能够跟踪代码执行过程中:

  • 指令访问次数 (I refs)
  • 指令缓存 miss (I1 misses)
  • 数据访问次数 (D refs)
  • 数据缓存 miss (D1 misses)
  • 级联缓存 (LL) miss

通过这些指标,我们可以看出代码哪些地方存在 cache miss ,从而优化访问模式。


四、简单代码实例:好的缓存模式 VS 坏的缓存模式

1. good_cache.c

#include <stdio.h>
int main() {
    int arr[1024][1024] = {0};
    long sum = 0;
    for (int i = 0; i < 1024; i++)
        for (int j = 0; j < 1024; j++)
            sum += arr[i][j];
    printf("sum = %ld\n", sum);
    return 0;
}

2. bad_cache.c

#include <stdio.h>
int main() {
    int arr[1024][1024] = {0};
    long sum = 0;
    for (int j = 0; j < 1024; j++)
        for (int i = 0; i < 1024; i++)
            sum += arr[i][j];
    printf("sum = %ld\n", sum);
    return 0;
}

执行 cachegrind

gcc -g -O0 -o good_cache good_cache.c
valgrind --tool=cachegrind ./good_cache

gcc -g -O0 -o bad_cache bad_cache.c
valgrind --tool=cachegrind ./bad_cache

对比结果截图分析:

(参考下方图示)

D1 miss rate:   1.3%   (顺序访问,好)
D1 miss rate:  10.6%   (跳跃访问,坏)

根本原因:缓存行是按行的地址序列存放,顺序访问最有利于命中,逆编辑访问导致大量缓存失效。


五、实战项目中 cachegrind 的作用

  • 分析性能瓶颈,查看是否缓存 miss 过多
  • 对优化前后的效果进行量化对比分析
  • 分析深层代码中不易察觉的缓存行为

六、总结

  • CPU 缓存失效会大幅降低性能
  • valgrind --tool=cachegrind 是分析缓存性能的强大工具
  • 通过缓存行为优化,可以达到显著性能改善

如果您希望进一步理解 cachegrind 工具的使用,推荐观看以下配套视频教程:

🎬 B 站视频链接:Valgrind 工具实战讲解 - Cachegrind 篇

欢迎关注“嵌入式 Jerry”频道,获取更多内存调试与性能优化技巧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值