如何通过字面意思判断哪块cpu比i7 4790k更好的cpu

关于CPU Cache:程序猿需要知道的那些 - 文章 - 伯乐在线
& 关于CPU Cache:程序猿需要知道的那些
先来看一张本文所有概念的一个思维导图()
为什么要有CPU Cache
随着工艺的提升最近几十年CPU的频率不断提升,而受制于制造工艺和成本限制,目前计算机的内存主要是DRAM并且在访问速度上没有质的突破。因此,CPU的处理速度和内存的访问速度差距越来越大,甚至可以达到上万倍。这种情况下传统的CPU通过FSB直连内存的方式显然就会因为内存访问的等待,导致计算资源大量闲置,降低CPU整体吞吐量。同时又由于内存数据访问的热点集中性,在CPU和内存之间用较为快速而成本较高的SDRAM做一层缓存,就显得性价比极高了。
为什么要有多级CPU Cache
随着科技发展,热点数据的体积越来越大,单纯的增加一级缓存大小的性价比已经很低了。因此,就慢慢出现了在一级缓存(L1 Cache)和内存之间又增加一层访问速度和成本都介于两者之间的二级缓存(L2 Cache)。下面是一段从What Every Programmer Should Know About Memory中摘录的解释:
Soon after the introduction of the cache the system got more complicated. The speed difference between the cache and the main memory increased again, to a point that another level of cache was added, bigger and slower than the first-level cache. Only increasing the size of the first-level cache was not an option for economical rea- sons.
此外,又由于程序指令和程序数据的行为和热点分布差异很大,因此L1 Cache也被划分成L1i (i for instruction)和L1d (d for data)两种专门用途的缓存。
下面一张图可以看出各级缓存之间的响应时间差距,以及内存到底有多慢!
什么是Cache Line
Cache Line可以简单的理解为CPU Cache中的最小缓存单位。目前主流的CPU Cache的Cache Line大小都是64Bytes。假设我们有一个512字节的一级缓存,那么按照64B的缓存单位大小来算,这个一级缓存所能存放的缓存个数就是512/64 = 8个。具体参见下图:
为了更好的了解Cache Line,我们还可以在自己的电脑上做下面这个有趣的实验。
下面这段C代码,会从命令行接收一个参数作为数组的大小创建一个数量为N的int数组。并依次循环的从这个数组中进行数组内容访问,循环10亿次。最终输出数组总大小和对应总执行时间。
#include "stdio.h"
#include &stdlib.h&
#include &sys/time.h&
long timediff(clock_t t1, clock_t t2) {
elapsed = ((double)t2 - t1) / CLOCKS_PER_SEC * 1000;
int main(int argc, char *argv[])
int array_size=atoi(argv[1]);
int repeat_times = ;
long array[array_size];
for(int i=0; i&array_ i++){
array[i] = 0;
clock_t start=clock();
while(j++&repeat_times){
if(k==array_size){
c = array[k++];
clock_t end =clock();
printf("%lu\n", timediff(start,end));
12345678910111213141516171819202122232425262728293031323334
#include "stdio.h"#include &stdlib.h&#include &sys/time.h&&long timediff(clock_t t1, clock_t t2) {&&&&long elapsed;&&&&elapsed = ((double)t2 - t1) / CLOCKS_PER_SEC * 1000;&&&&return elapsed;}&int main(int argc, char *argv[])#*******{&&&&&int array_size=atoi(argv[1]);&&&&int repeat_times = ;&&&&long array[array_size];&&&&for(int i=0; i&array_size; i++){&&&&&&&&array[i] = 0;&&&&}&&&&int j=0;&&&&int k=0;&&&&int c=0;&&&&clock_t start=clock();&&&&while(j++&repeat_times){&&&&&&&&if(k==array_size){&&&&&&&&&&&&k=0;&&&&&&&&}&&&&&&&&c = array[k++];&&&&}&&&&clock_t end =clock();&&&&printf("%lu\n", timediff(start,end));&&&&return 0;}
如果我们把这些数据做成折线图后就会发现:总执行时间在数组大小超过64Bytes时有较为明显的拐点(当然,由于博主是在自己的Mac笔记本上测试的,会受到很多其他程序的干扰,因此会有波动)。原因是当数组小于64Bytes时数组极有可能落在一条Cache Line内,而一个元素的访问就会使得整条Cache Line被填充,因而值得后面的若干个元素受益于缓存带来的加速。而当数组大于64Bytes时,必然至少需要两条Cache Line,继而在循环访问时会出现两次Cache Line的填充,由于缓存填充的时间远高于数据访问的响应时间,因此多一次缓存填充对于总执行的影响会被放大,最终得到下图的结果:
如果读者有兴趣的话也可以在自己的linux或者MAC上通过gcc cache_line_size.c -o cache_line_size编译,并通过./cache_line_size执行。
了解Cache Line的概念对我们程序猿有什么帮助?
我们来看下面这个C语言中常用的循环优化例子
下面两段代码中,第一段代码在C语言中总是比第二段代码的执行速度要快。具体的原因相信你仔细阅读了Cache Line的介绍后就很容易理解了。
for(int i = 0; i & i++) {
for(int j = 0; j & j++) {
arr[i][j] =
for(int i = 0; i & n; i++) {&&&&for(int j = 0; j & n; j++) {&&&&&&&&int num;&&&&&&&&&&&&//code&&&&&&&&arr[i][j] = num;&&&&}}
for(int i = 0; i & i++) {
for(int j = 0; j & j++) {
arr[j][i] =
for(int i = 0; i & n; i++) {&&&&for(int j = 0; j & n; j++) {&&&&&&&&int num;&&&&&&&&&&&&//code&&&&&&&&arr[j][i] = num;&&&&}}
CPU Cache 是如何存放数据的
你会怎么设计Cache的存放规则
我们先来尝试回答一下那么这个问题:
假设我们有一块4MB的区域用于缓存,每个缓存对象的唯一标识是它所在的物理内存地址。每个缓存对象大小是64Bytes,所有可以被缓存对象的大小总和(即物理内存总大小)为4GB。那么我们该如何设计这个缓存?
如果你和博主一样是一个大学没有好好学习基础/数字电路的人的话,会觉得最靠谱的的一种方式就是:Hash表。把Cache设计成一个Hash数组。内存地址的Hash值作为数组的Index,缓存对象的值作为数组的Value。每次存取时,都把地址做一次Hash然后找到Cache中对应的位置操作即可。
这样的设计方式在高等语言中很常见,也显然很高效。因为Hash值得计算虽然耗时(10000个CPU Cycle左右),但是相比程序中其他操作(上百万的CPU Cycle)来说可以忽略不计。而对于CPU Cache来说,本来其设计目标就是在几十CPU Cycle内获取到数据。如果访问效率是百万Cycle这个等级的话,还不如到Memory直接获取数据。当然,更重要的原因是在硬件上要实现Memory Address Hash的功能在成本上是非常高的。
为什么Cache不能做成Fully Associative
Fully Associative 字面意思是全关联。在CPU Cache中的含义是:如果在一个Cache集内,任何一个内存地址的数据可以被缓存在任何一个Cache Line里,那么我们成这个cache是Fully Associative。从定义中我们可以得出这样的结论:给到一个内存地址,要知道他是否存在于Cache中,需要遍历所有Cache Line并比较缓存内容的内存地址。而Cache的本意就是为了在尽可能少得CPU Cycle内取到数据。那么想要设计一个快速的Fully Associative的Cache几乎是不可能的。
为什么Cache不能做成Direct Mapped
和Fully Associative完全相反,使用Direct Mapped模式的Cache给定一个内存地址,就唯一确定了一条Cache Line。设计复杂度低且速度快。那么为什么Cache不使用这种模式呢?让我们来想象这么一种情况:一个拥有1M L2 Cache的32位CPU,每条Cache Line的大小为64Bytes。那么整个L2Cache被划为了1M/64=16384条Cache Line。我们为每条Cache Line从0开始编上号。同时32位CPU所能管理的内存地址范围是2^32=4G,那么Direct Mapped模式下,内存也被划为4G/K的小份。也就是说每256K的内存地址共享一条Cache Line。
但是,这种模式下每条Cache Line的使用率如果要做到接近100%,就需要操作系统对于内存的分配和访问在地址上也是近乎平均的。而与我们的意愿相反,为了减少内存碎片和实现便捷,操作系统更多的是连续集中的使用内存。这样会出现的情况就是0-1000号这样的低编号Cache Line由于内存经常被分配并使用,而16000号以上的Cache Line由于内存鲜有进程访问,几乎一直处于空闲状态。这种情况下,本来就宝贵的1M二级CPU缓存,使用率也许50%都无法达到。
什么是N-Way Set Associative
为了避免以上两种设计模式的缺陷,N-Way Set Associative缓存就出现了。他的原理是把一个缓存按照N个Cache Line作为一组(set),缓存按组划为等分。这样一个64位系统的内存地址在4MB二级缓存中就划成了三个部分(见下图),低位6个bit表示在Cache Line中的偏移量,中间12bit表示Cache组号(set index),剩余的高位46bit就是内存地址的唯一id。这样的设计相较前两种设计有以下两点好处:
给定一个内存地址可以唯一对应一个set,对于set中只需遍历16个元素就可以确定对象是否在缓存中(Full Associative中比较次数随内存大小线性增加)
每2^18(256K)*64=16M的连续热点数据才会导致一个set内的conflict(Direct Mapped中512K的连续热点数据就会出现conflict)
为什么N-Way Set Associative的Set段是从低位而不是高位开始的
下面是一段从How Misaligning Data Can Increase Performance 12x by Reducing Cache Misses摘录的解释:
The vast majority of accesses are close together, so moving the set index bits upwards would cause more conflict misses. You might be able to get away with a hash function that isn’t simply the least significant bits, but most proposed schemes hurt about as much as they help while adding extra complexity.
由于内存的访问通常是大片连续的,或者是因为在同一程序中而导致地址接近的(即这些内存地址的高位都是一样的)。所以如果把内存地址的高位作为set index的话,那么短时间的大量内存访问都会因为set index相同而落在同一个set index中,从而导致cache conflicts使得L2, L3 Cache的命中率低下,影响程序的整体执行效率。
了解N-Way Set Associative的存储模式对我们有什么帮助
了解N-Way Set的概念后,我们不难得出以下结论:2^(6Bits &Cache Line Offset& + 12Bits &Set Index&) = 2^18 = 512K。即在连续的内存地址中每512K都会出现一个处于同一个Cache Set中的缓存对象。也就是说这些对象都会争抢一个仅有16个空位的缓存池(16-Way Set)。而如果我们在程序中又使用了所谓优化神器的“内存对齐”的时候,这种争抢就会越发增多。效率上的损失也会变得非常明显。具体的实际测试我们可以参考: How Misaligning Data Can Increase Performance 12x by Reducing Cache Misses 一文。
这里我们引用一张Gallery of Processor Cache Effects 中的测试结果图,来解释下内存对齐在极端情况下带来的性能损失。
该图实际上是我们上文中第一个测试的一个变种。纵轴表示了测试对象数组的大小。横轴表示了每次数组元素访问之间的index间隔。而图中的颜色表示了响应时间的长短,蓝色越明显的部分表示响应时间越长。从这个图我们可以得到很多结论。当然这里我们只对内存带来的性能损失感兴趣。有兴趣的读者也可以阅读原文分析理解其他从图中可以得到的结论。
从图中我们不难看出图中每1024个步进,即每96Bytes,都有一条特别明显的蓝色竖线。也就是说,只要我们按照4K的步进去访问内存(内存根据4K对齐),无论热点数据多大它的实际效率都是非常低的!按照我们上文的分析,如果4KB的内存对齐,那么一个80MB的数组就含有20480个可以被访问到的数组元素;而对于一个每512K就会有set冲突的16Way二级缓存,总共有512K/20480=25个元素要去争抢16个空位。那么缓存命中率只有64%,自然效率也就低了。
想要知道更多关于内存地址对齐在目前的这种CPU-Cache的架构下会出现的问题可以详细阅读以下两篇文章:
How Misaligning Data Can Increase Performance 12x by Reducing Cache Misses
Gallery of Processor Cache Effects
Cache淘汰策略
在文章的最后我们顺带提一下CPU Cache的淘汰策略。常见的淘汰策略主要有LRU和Random两种。通常意义下LRU对于Cache的命中率会比Random更好,所以CPU Cache的淘汰策略选择的是LRU。当然也有些实验显示在Cache Size较大的时候Random策略会有更高的命中率
CPU Cache对于程序猿是透明的,所有的操作和策略都在CPU内部完成。但是,了解和理解CPU Cache的设计、工作原理有利于我们更好的利用CPU Cache,写出更多对CPU Cache友好的程序
可能感兴趣的话题
“同时64位CPU所能管理的内存地址范围是2^32=4G”,应该是32位而不是64。
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线cpu是什么有哪些分类?cpu是什么意思及其作用介绍
作者:佚名
字体:[ ] 来源:互联网 时间:08-13 09:43:54
cpu全称Central Processing Unit 中文意思是中央处理器,每个单词的第一个字母提取出来就可以说是cpu了,下面为大家介绍下CPU的分类及其作用,感兴趣的朋友可以参考下
 最近发现有网友在QQ群里问,cpu是什么?得到不少网友的炮轰,在这电脑满地有的年头竟然还有人不知道cpu是什么?不过笔者觉得对于不常接触电脑的朋友,确实很可能不知道cpu是什么意思,如果大家都没接触过电脑,或者换到时间是在10年以前,我相信会有非常多的朋友不知道cpu是什么。
 中国目前电脑普及率,确实越来越高,但距离发达国家依然有着很大的差距。今天编辑为很少接触电脑的朋友简单的介绍下cpu是什么。首先我们要知道的是cpu是很电脑有关的硬件,cpu全称Central Processing Unit 中文意思是中央处理器,每个单词的第一个字母提取出来就可以说是cpu了。
 中央处理器(英文Central Processing Unit,CPU)是一台计算机的运算核心和控制核心。CPU、内部存储器和输入/输出设备是电子计算机三大核心部件。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶段:提取(Fetch)、解码(Decode)、执行(Execute)和写回(Writeback)。 CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码,并执行指令。所谓的计算机的可编程性主要是指对CPU的编程。
 CPU品牌有两大阵营,分别是Intel(英特尔)和AMD,这两个行业老大几乎垄断了CPU市场,大家拆开电脑看看,无非也是Intel和AMD的品牌(当然不排除极极少山寨的CPU)。而Intel的CPU又分为Pentium(奔腾) 、Celeron(赛扬)和Core(酷睿)。其性能由高到低也就是Core>Pentium>Celeron。AMD 的CPU分为Semporn(闪龙)和Athlon(速龙),性能当然是Athlon优于Semporn的了。&
Intel与AMD标志认识
 阅读完本文,相信初次接触或听说cpu的朋友应该会有一个比较清晰的认识吧,其实很多东西只有接触到了,去找资料就会明白,建议新手朋友遇到不懂的电脑知识可以尝试在脚本之家()多查找下相关技术文章,这样可能比再群里了解cpu的更全面些。
大家感兴趣的内容
12345678910
最近更新的内容以上由提供
您的位置:
> CPU Fan Error是什么意思?Win7开机提示CPU Fan Error的原因及解决方法
CPU Fan Error是什么意思?Win7开机提示CPU Fan Error的原因及解决方法
  用户在启动Win7系统的时候,屏幕突然黑屏,出现一连串的英文字母,最后提示CPU Fan Error,需要按FI才能继续,虽然这对正常开机没有多大影响,但CPU Fan Error是什么意思呢?为什么会出现这种现象呢?从字面上看应该是与系统CPU有关系,下面让小编为大家详细的分析解决。
  Win7开机提示CPU Fan Error的原因及解决方法:
  1、系统BIOS检测不到CPU风扇的转速
  这个是最常见的原因之一,我们可以进BIOS查看,开机后按下DEL键进入BIOS选项,接着进入Power&Hardware monitor,我们会看到有三个选项CPU FAN SPEED;CHASSIS FANSPEED;POWER FAN SPEED,将CPU FAN SPEED项改成IGNORED,CHASSIS FANSPEED项改成N/A,POWER FAN SPEED项改成IGNORED。
  2、CPU风扇工作不正常转速太低
  由于风扇质量不高,或者使用时间太久,风扇转速变慢,灰尘太多等原因引起的风扇转速变慢引起的,个人建议直接换个CPU风扇即可解决。
  3、主板CPU风扇电源线插错
  一般来说主板上都有多个风扇的接口,有些接口是不一样的,一般来说主板接风扇的接口有两种,一种是接机箱风扇的接口一种是接CPU风扇用的接口。如果当插错的话,那么就会出现这种错误,CPU应该插到旁边有&CPU Fan&接口上。如果不插到这里的话,虽然CPU风扇能正常的散热,正常的使用,但是主板往往会在开机的时候提示开机时BIOS提示CPU Fan Error错误警告。
  4、主板BIOS设置错误
  一般此类错误直接把主板BIOS的设置直接恢复默认即可,如果自己不会设置的话,拆开机箱,直接把主板上的电池拔上来,等个半分钟才放回去,这样一来主板因为没有电就会自动恢复初始化了
  提示:需要重视CPU Fan Error错误提示,尤其是在服务器上,如果出现这样的提示,更应该注意,以免造成更大的损失!
  造成Win7开机出现CPU Fan Error错误的原因有很多种,但大多数是与CPU和系统BIOS设置有关系,由于CPU是Windows系统的核心组成部分,出现这种情况,用户还是需要多重视的。
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
Copyright (C)2014 www.xitongcheng.cc All rights reserved
本站发布的系统与软件仅为个人学习测试使用,请在下载后24小时内删除,不得用于任何商业用途,否则后果自负,请支持购买微软正版软件!
黔ICP备号-1后使用快捷导航没有帐号?
查看: 12662|回复: 7
CPU的“步进”是什么意思?哪种好?我们的小Y适合哪个?
该用户从未签到
CPU的“步进”是什么意思?哪种好?我们的小Y适合哪个?
先学习下,为以后换U打好基础~
该用户从未签到
网上找来的
步进是计算机处理器进步的过程,或者说是处理器改进的过程,每一次步进代表CPU的一次改进,每次步进都有编号,
而这些编号由厂家决定。厂家根据这些编号,可以对自己生产的CPU产品进行有效的跟踪,核定其性能。
一般来说步进采用字母加数字的方式来表示,例如A0,B1,C2等等,字母或数字越靠后的步进也就是越新的产品。一般来说,步进编号中数字的变化,例如A0到A1,表示生产工艺较小的改进;而步进编号中字母的变化,例如A0到B1,则表示生产工艺比较大的或复杂的改进。
MO到GO,字母跨越较大,估计,M0比G0改进比较大,应该先进不少。
CPU的步进(Stepping),简单的来说就是CPU产品在投入生产后,会在产品内部标注不同编号以表示其生产时所采用的不同水准或进程。如:第一批次投产的Intel处理器,会叫做A0,之后是A1,A2等,当工艺有较为明显的改进时,会改用B0,再是C0,D0,MO……当然了,一般来说,步进越靠后的产品工艺就越先进,越值得购买,直接带来的就是BUG的解决,特性增加或者功耗的降低等
该用户从未签到
路过&&学习中。。。。。。。。。。
该用户从未签到
明白了,谢谢~
该用户从未签到
由此可见,E0的P9500还是比C0的好
该用户从未签到
楼主也想换U了?
该用户从未签到
E0看上去比C0好,理论上。但是每颗U的体质都不同,看RP也要。
基本上就是一个比上一个有改进或提高之类的。
一般像P9500就是E0比C0好,所以SLB4E的也不如QJXC的E0 ES,实际上。个人观点
不过我的C0 还是很不错的
该用户从未签到
这个还是越后的步进越好 INTEL往往在后面的步进使用新技术或者新工艺 比如说P55芯片组的B3步进就支持带显卡 之前的步进就不支持
17年2月精华宗师
17年2月精华大师
精华内容汇总
关注本友会
本友会微信公众号
VR微信公众号
benyouhui2012
Powered by}

我要回帖

更多关于 如何判断cpu是否损坏 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信