CPU高速缓存行

CPU 为了更快的执行代码。于是当从内存中读取数据时,并不是只读自己想要的部分。而是读取足够的字节来填入高速缓存行。根据不同的 CPU ,高速缓存行大小不同。如 X86 是 32BYTES ,而 ALPHA 是 64BYTES 。并且始终在第 32 个字节或第 64 个字节处对齐。这样,当 CPU 访问相邻的数据时,就不必每次都从内存中读取,提高了速度。 因为访问内存要比访问高速缓存用的时间多得多。

 

但是,多核发达的年代。情况就不能那么简单了。试想下面这样一个情况。

1、      CPU1 读取了一个字节,以及它和它相邻的字节被读入 CPU1 的高速缓存。

2、      CPU2 做了上面同样的工作。这样 CPU1 , CPU2 的高速缓存拥有同样的数据。

3、      CPU1 修改了那个字节,被修改后,那个字节被放回 CPU1 的高速缓存行。但是该信息并没有被写入 RAM 。

4、      CPU2 访问该字节,但由于 CPU1 并未将数据写入 RAM ,导致了数据不同步。

 

为了解决这个问题,芯片设计者制定了一个规则。当一个 CPU 修改高速缓存行中的字节时,计算机中的其它CPU 会被通知,它们的高速缓存将视为无效。于是,在上面的情况下, CPU2 发现自己的高速缓存中数据已无效,CPU1 将立即把自己的数据写回 RAM ,然后 CPU2 重新读取该数据。 可以看出,高速缓存行在多处理器上会导致一些不利。

 

从上面的情况可以看出,在设计数据结构的时候,应该尽量将只读数据与读写数据分开,并具尽量将同一时间访问的数据组合在一起。这样 CPU 能一次将需要的数据读入。

 

如:

Struct __a

{

   Int id; // 不易变

   Int factor;// 易变

   Char name[64];// 不易变

   Int value;// 易变

} ;

这样的数据结构就很不利。

在 X86 下,可以试着修改和调整它

Struct __a

{

   Int id; // 不易变

Char name[64];// 不易变

Char __Align[32 – sizeof(int)+sizeof(name)*sizeof(name[0])%32]

   Int factor;// 易变

   Int value;// 易变

Char __Align2[32 –2* sizeof(int)%32]

 

} ;

 

32 – sizeof(int)+sizeof(name)*sizeof(name[0])%32

看起来很不和谐, 32 表示 X86 中,高速缓存行为 32BYTES 大小。 __Align 用于显式对齐。

 

 

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2010/07/02/1940483.html

时间: 2024-10-27 18:59:33

CPU高速缓存行的相关文章

【译】AS3利用CPU缓存

利用CPU缓存   计算机有随机存取存储器RAM(译注:即我们常说的内存),但有更快形式的存储器.如果你希望你的应用程序的快速运行,你需要知道这些其他的存储器.今天的文章中讨论了它们,并给出了两个AS3例子,即使有这样的高级语言,你仍然可以利用它们. RAM的确很快,但只是与硬盘,固态硬盘,光盘,互联网等等与比较时.RAM与CPU内置的高速缓存相比,它并不快.你可能已经听说过他们,CPU高速缓存的级别分别称为:L1,L2和L3. CPU高速缓存用来存储小块的RAM内容.当RAM被请求时,可以使用

剖析Disruptor:为什么会这么快?(二)神奇的缓存行填充

我们经常提到一个短语Mechanical Sympathy,这个短语也是Martin博客的标题(译注:Martin Thompson),Mechanical Sympathy讲的是底层硬件是如何运作的,以及与其协作而非相悖的编程方式. 我在上一篇文章中提到RingBuffer后,我们收到一些关于RingBuffer中填充高速缓存行的评论和疑问.由于这个适合用漂亮的图片来说明,所以我想这是下一个我该解决的问题了.(译注:Martin Thompson很喜欢用Mechanical Sympathy这

《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.3 直接映射高速缓存

2.3 直接映射高速缓存 最简单的高速缓存组织就是直接映射(direct mapped)或者单路组相联(one-way set associative)高速缓存(短语"单路组相联"的意思在下一节介绍"双路组相联"的时候就清楚了).TI MicroSPARC的片上数据高速缓存使用的就是这种高速缓存组织.它包含有2 KB的数据高速缓存,组织成128个高速缓存行,每行16字节.在如图2-5所示的这种类型的高速缓存中,在保存数据的部分高速缓存里,以散列算法用地址计算出每行有

每个程序员都应该了解的内存知识(2)-CPU caches

英文原帖:http://lwn.net/Articles/252125/ 原翻译贴:http://www.oschina.net/translate/what-every-programmer-should-know-about-cpu-cache-part2       现在的CPU比25年前要精密得多了.在那个年代,CPU的频率与内存总线的频率基本在同一层面上.内存的访问速度仅比寄存器慢那么一点点.但是,这一局面在上世纪90年代被打破了.CPU的频率大大提升,但内存总线的频率与内存芯片的性能

笔记本电脑CPU正常温度是多少?怎样控制与防范?

1.CPU温度一般是多少? 我们在网上查到一些CPU温度的正常范围,如下: AMD处理器: AMD Althon, Althon Opteron, Duron 以及 Sempron 系列 AMD Athlon XP 1.33GHz+ 90度 AMD Athlon XP T-Bred upto 2100+ 90度 AMD Athlon XP T-Bred over 2100+ 85度 AMD Athlon XP Barton 85度 AMD Athlon 64 70度 AMD Athlon 64

CPU温度一般是多少?

我们在网上查到一些CPU温度的正常范围,如下: AMD处理器: AMD Althon, Althon Opteron, Duron 以及 Sempron 系列 AMD Athlon XP 1.33GHz+ 90度 AMD Athlon XP T-Bred upto 2100+ 90度 AMD Athlon XP T-Bred over 2100+ 85度 AMD Athlon XP Barton 85度 AMD Athlon 64 70度 AMD Athlon 64 (Socket 939, 1

鲁大师2015检测电脑CPU温度一般是多少

  鲁大师2015检测电脑CPU温度一般是多少 首先AMD处理器 AMD Althon, Althon Opteron, Duron 以及 Sempron 系列 AMD Athlon XP 1.33GHz+ 90度 AMD Athlon XP T-Bred upto 2100+ 90度 AMD Athlon XP T-Bred over 2100+ 85度 AMD Athlon XP Barton 85度 AMD Athlon 64 70度 AMD Athlon 64 (Socket 939,

C#版本的CPU性能测试

本文不讲C#开发技巧,只测试同样的代码在不同CPU的机器上的运行速度.结果包括普通版本和并行版本的对比,方便大家选配电脑,对"性能"有个感性的认识. 一. 测试原理     字符串相关度计算是文本处理和数据挖掘中一个不可或缺的方法,例如论文查重等.Levenshtein Distance可以用来比较两个字符串的相似度,即两个字符串之间的"距离".这个"距离"其实就是从源字符串变换到目标字符串需要进行的删除.插入和替换的次数.   有不少该算法的改

基于Intel 80×86 CPU的IBM PC及其兼容计算机的启动流程

前段时间我在微博上看到了阮一峰的一篇日志<计算机是如何启动的?>才想起来自己之前尝试探索X86架构计算机的启动流程来着,趁着还没遗忘就先记录下一部分结论吧.不过相对于阮一峰的这篇博文,我的侧重点在于BIOS查找"启动顺序"(Boot Sequence)之前,也就是从按下电源到BIOS移交权限之间的这一段.关于MBR分区体系磁盘的分区表,阮一峰描述的很详细,我就不重复造轮子了. 顺便罗嗦一下,有关"扩展分区"(Extended partition)描述,阮