📜  优化多级缓存性能的分析方法

📅  最后修改于: 2021-06-28 19:48:38             🧑  作者: Mango

先决条件–多级缓存组织

程序的执行时间是执行程序所需的CPU周期总数的乘积。对于具有单级缓存的内存系统,总周期数是内存速度和缓存未命中率的函数。

m(C)= f(S,C,A,B)
m(C)=缓存未命中率
C =缓存大小
A =关联性
S =套数
B =块大小

特定高速缓存中可归因于指令数据的主存储器的部分为N MM ,可以用线性一阶函数的形式表示。

N_{total} = g(m(C), B, LA, TR, t_{CPU})\newline

其中最重要的是从内存读取开始到请求数据传输之间的等待时间(LA)。等待主存储器所花费的周期数用LA表示,TR是传输速率,它是可以传输数据的最大速率,也称为波特率。

如上图所示,未命中率与总周期数之间存在上述线性关系。这清楚地表明,随着组织参数值的增加,未命中率会无症状地下降。反过来,这导致总周期数减少。

要量化的最困难的关系是CPU的循环时间和控制它的参数之间的关系,因为它取决于最低级别的实现。它的方程式可能看起来像。

t_{CPU} = h(C,S,A,B)[3]\\

现在,眼前的问题变成了将系统级性能与各种缓存和内存参数相关联。

总执行时间是周期时间和总周期数的乘积。

T_{total} = t_{CPU}\times N_{total} = t_{L1}(C) \times N_{total} [4]\\

为了获得最短执行时间,我们发现相对于某个变量的偏导数等于零。

\frac{1}{t_{L1}}\times \frac{\partial t_{L1}}{\partial C} = -\frac{1}{N_{total}}\times \frac{\partial N_{total}}{\partial C}\\

对于非连续离散变量,上述方程式具有不同的形式。

\frac{1}{ t_{L1}} \times \frac{\Delta t_{L1}}{\Delta C}=-\frac{1}{N_{total}}\times \frac{\Delta N_{total}}{\Delta C}[5]\\

如果持续一段时间,则更改不会影响性能。但是,如果左侧大于更改,则将增加总体执行时间,并且如果右侧大于该值,则将获得净收益。

对于单级缓存,周期总数由不执行内存引用所花费的周期数得出。加上执行指令提取,加载和存储所花费的周期数;加上等待主内存所花费的时间。

N_{total} = N_{Execute}+N_{Ifetch}\times m(C)\times \bar n_{MMread} +N_{load}+N_{Load}\times m(C)\times \bar n_{MMread} +N_{Store}\times \bar n_{L1write}[6]\\

N execute =不执行内存引用所花费的周期数

N Ifetch =程序或跟踪中的指令提取次数

N负载=负载

N商店=商店数

n MMread =满足读取高速缓存未命中所花费的平均周期数

n L1write =具有单周期执行的RISC机器处理写入高速缓存所花费的平均周期数,其中两个参考都不处于活动状态的周期数N Execute为零。

现在我们可以将等式6的所有并行发生的操作数设为1,因为它们仅累积大量的时间。然后,等式6变为。

N_{total} = n_{Read}(1+m_{Read}(C)\times \bar n_{MMread})+N_{Store}\times \bar n_{L1write}[7]\\

对于具有单周期执行和哈佛架构且能够并行执行指令数据和数据引用生成负载的机器,只有当它们在数据高速缓存中丢失时才有助于周期计数。

N_{Total} = N_{Ifetch} +N_{Ifetch}\times m(\textbf C_{L1t})\times \bar n_{MMread} +N_{Load}\times m(\textbf C_{L1D}\times \bar n_{MMread}) +N_{store}\times (n_{L1write}-1)[8]\\