基于数据存储方式的代码优化(1)

本文探讨了如何通过调整循环中变量的顺序来优化程序性能。特别地,通过改变数组的访问方式,可以显著减少内存访问延迟,进而提高执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于默认的行主维(即 matrix[i] 表示一行)形式的二维数组,下面两段代码

for(int i = 0; i < Size; ++i)
    for(int j = 0; j < Size; ++j)
        for(int k = 0; k < Size; ++k)
            for(int l = 0; l < Size; ++l)
                matS[i][j] += (vecs[i][k] * vecs[j][l] * ovlp[k][l]);

以及

for(int i = 0; i < Size; ++i)
    for(int j = 0; j < Size; ++j)
        for(int k = 0; k < Size; ++k)
            for(int l = 0; l < Size; ++l)
                matS[i][j] += (vecs[k][i] * vecs[l][j] * ovlp[k][l]);

看似区别很小,而且如果对第一段代码中的 vecs 矩阵在执行此四重循环之前先做转置,则两段代码的结果也是相同的。不同的是,第一段代码的执行效率比第二段高出许多(以 1240*1240 大小的矩阵为例,每次对一个最外层变量 i 执行完里层的三重循环,第一段代码大约需要 6 秒,而第二段需要近 18 秒)。

导致此问题的原因是,四个指标变化速度从快到慢依次是 l, k, ji,代码 1 中始终将变化更频繁的指标放到后面(即 “[i][k]” 这样),而代码 2 中则有变化更频繁的指标在变化较慢的指标之前(即“[k][i]”这样)。CPU 执行时,会将连续数列中的相邻元素一起放入寄存器,使用矢量化指令集优化时尤其如此,故代码 1 的形式更有利于 CPU 快速读取数据,代码 2 则需要更多的内存跳转。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值