从Cache学习卓越编程

“不了解计算机系统,就不能写出卓越程序!”这是《编程卓越之道》系列丛书的主要思想。实际上也是如此!那么,怎么去了解系统呢?我是从缓存(cache,发音同cash)这个概念入手的。之前看到个经典的程序:libsvm。其中使用了cache,于是就对它产生浓厚的兴趣。

CPU-Z是一款免费绿色软件,用于测量CPU、缓存、内存、主板等核心硬件的参数!我们要看的是CPU和缓存,因为我最关心的cache在这里嘛。先看看CPU页的时钟-核心速度,它就是通常说的 CPU 的主频了,多为 2.4GHz1.4GHz。这里要说明的是,主频并不直接代表CPU的运算速度,但和运算速度有关。主频= 倍频 x 外频。外频是CPU和主板之间的同步运行的速度,此时可以理解为CPU的外频直接与内存相通,目前以133MHz外频的CPU为主流。前端总线一般被认为是外频的另一个名字,其实它是数据传输的速度。如果数据传输的极限速度不能满足CPU的运算速度,则过度提高倍频是没有意义的,一般倍频在5~8倍之间CPU的性能会得到充分发挥,极限为10倍。

寄存器 -> 一级Cache -> 二级Cache -> 主存 -> 磁盘。这是现代计算机的存储层次。寄存器和一级(L1Cache都在CPU上,大多数奔腾234 CPU 都提供二级(L2Cache,但是有些赛扬芯片没有,访问他们所需时钟周期(主频的倒数)的个数分别为2~37~1070~10010e6~10e7。每个时钟周期内CPU处理的指令数目根据数据依赖关系和资源约束而变化。关于CPU-Z中的CacheL1有数据和跟踪两项,前者叫数据Cache,用于存储数据,一般的Intel CPU 该值为4~32 KB(一般为8 KB),后者用于存储指令,所以也叫指令Cache。针对Cache的访问决定程序的速度,如果频繁调用其中的数据(叫Cache命中,Cache Hit),则程序速度较快,否则造成Cache缺失(Cache Miss),到二级Cache甚至是主存和磁盘存取数据,则速度大打折扣,这就是上文说的数据传输的问题。

想给个例子:C语言实现1000 x 1000的两个double矩阵相乘。目前正在研究“分块(blocking)”,我还不知如何控制数据存储在L1/L2,欢迎大家探讨。

参考资料

1CPU的主频、外频、倍频、前端总线祥解

2计算机核心部件名词解释

3、《现代编译原理C语言描述》(书)

4、《编程卓越之道.第一卷,深入理解计算机》(书) 

你可能感兴趣的:(编码相关)