CSAPP读书笔记第六章(优化cache命中率)

本文通过实例分析了程序的局部性原理,指出按行访问内存能有效提升性能,编译器会优化连续访问。讨论了高速缓存的工作机制,解释了不命中时的数据复制过程,并举例说明了矩阵乘法和转置优化,通过循环展开减少不命中率,显著提升计算速度。
摘要由CSDN通过智能技术生成

(1):

程序具有时间局部性和空间局部性.时间局部性是指当前用的存储器位置可能在不久的将来被用到,会被放入告诉缓存。空间局部性则是指一个存储器位置被用到,那么相邻的几个位置在不久的将来也可能被用到,也会被放入告诉缓存!

根据我在vs2013的测试,发现sum函数要比sum2快几十倍的速度,这完全得益于我们按照行来访问,这天然的符合vector的存储方式,另外在release情况下编译器会优化掉a[i][j],它会找一个临时变量 x = a[i],这样就不需要每次都去寻找a[i]了。

data_type sum(vector<vector<data_type>>& a,int k ){
    auto M = a.size(), N = a[0].size();
    data_type res = 0;
    for (size_t i = 0; i != M; ++i)
    {
        for (size_t j = 0; j != N; ++j)
            res +=a[i][j];
    }
    return res+k;
}
data_type sum2(vector<vector<data_type>>& a,int k){
        auto M = a.size(), N = a[0].size();
        data_type res = 0;
        for (size_t j = 0; j != N; ++j)
        {
            for (size_t i = 0; i != M; ++i)
                res += a[i][j];
        }

        return res+k;

}

再看一个关于空间局部性的例子:

struct point {
    int vec[3];
    int acc[3];
};
using p_array = vector<point>;

可以发现如果clear函数没有进行auto &p1 = p[i]的优化,编译器居然没有进行这样的优化,其原因不得而知,所以最好的办法是clear2这样,简单而且速度快。

void clear(p_array& p ){
    int n = p.size();
    for (int i = 0; i != n; ++i)
    {
        auto& p1 = p[i];//编译器没有对这里进行优化
        for (int j = 0; j != 3; ++j)
            p1.vec[j] = 0;
        for (
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值