之前已经提到了很多关于cache的相关知识,我们知道,cache命中和未命中造成的性能差异会很大,两种时钟周期差异可以到达10倍以上。简单来说,我们可以将CPU运行时间用以下的式子表示
\( CPU \ execution \ time = (CPU \ clock \ cycles + Memory \ stall \ cycles ) \times Clock \ cycle \ time \)
这个等式假设 CPU 时钟周期包括处理缓存命中的时间,并且处理器在缓存未命中期间停顿的情况
内存停顿周期(\( Memory \ stall \ cycles \))取决于未命中数和每个未命中的花费
$$\begin{array}{l}
Memory \ stall \ cycles &=& Number \ of \ misses \times Miss \ penalty \\
& = & IC \times \frac{Misses}{Instruction} \times Miss \ penalty \\
& = & IC \times \frac{Memory \ accesses}{Instruction} \times Miss \ rate \times Miss \ penalty \\
\end{array}$$
其中\( IC \)指的是指令总数,\( \frac{Memory \ accesses}{Instuction} \)指的是每个指令引用的内存数量,\( Miss \ rate \)指未命中几率,\( Miss \ penalty \)未命中惩罚。
通过上面这个等式我们可以很清楚看到\( Memory \ stall \ cycles \)如何降低,一般通过降低\( Miss \ rate \)和\( Miss \ penalty \)两项来优化
顺便提一下,其实在读和写上\( Miss \ rate \)和\( Miss \ penalty \)是不同的,原本公式为:
\( Memory \ stall \ clock \ cycles = IC \times Reads \ per \ instruction \times Read \ miss \ rate \times Read \ miss \ penalty \\ + IC \times Writes \ per \ instruction \times Write \ miss \ rate \times Write \ miss \ penalty \)
但是我们一般简化,通过合并读和写找到平均未命中几率和平均未命中惩罚
\( Memory \ stall \ clock \ cycles = IC \times \frac{Memory \ accesses}{Instruction} \times Miss \ rate \times Miss \ penalty \)