2023年7月3日发(作者:)
二级 内存 CPU 一次内存读取竟然要一万个缓存(一级二级)内存CPU&&一次内存读取竟然要一万个时钟周期2010年09月28日星期二14:52 CPU缓存(Cache Memory)位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。由此可见,在CPU中加入缓存是一种高效的解决方案,这样整个内存储器(缓存+内存)就变成了既有缓存的高速度,又有内存的大容量的存储系统了。缓存对CPU的性能影响很大,主要是因为CPU的数据交换顺序和CPU与缓存间的带宽引起的。
缓存的工作原理是当CPU要读取一个数据时,首先从缓存中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。
正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在缓存中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先缓存后内存。
最早先的CPU缓存是个整体的,而且容量很低,英特尔公司从Pentium时代开始把缓存进行了分类。当时集成在CPU内核中的缓存已不足以满足CPU的需求,而制造工艺上的限制又不能大幅度提高缓存的容量。因此出现了集成在与CPU同一块电路板上或主板上的缓存,此时就把CPU内核集成的缓存称为一级缓存,而外部的称为二级缓存。一级缓存中还分数据缓存(Data Cache,D-Cache)和指令缓存(Instruction Cache,I-Cache)。二者分别用来存放数据和执行这些数据的指令,而且两者可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能。英特尔公司在推出Pentium 4处理器时,用新增的一种一级追踪缓存替代指令缓存,容量为12KμOps,表示能存储12K条微指令。
随着CPU制造工艺的发展,二级缓存也能轻易的集成在CPU内核中,容量也在逐年提升。现在再用集成在CPU内部与否来定义一、二级缓存,已不确切。而且随着二级缓存被集成入CPU内核中,以往二级缓存与CPU大差距分频的情况也被改变,此时其以相同于主频的速度工作,可以为CPU提供更高的传输速度。
二级缓存是CPU性能表现的关键之一,在CPU核心不变化的情况下,增加二级缓存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二级缓存上有差异,由此可见二级缓存对于CPU的重要性。
CPU在缓存中找到有用的数据被称为命中,当缓存中没有CPU所需的数据时(这时称为未命中),CPU才访问内存。从理论上讲,在一颗拥有二级缓存的CPU中,读取一级缓存的命中率为80%。也就是说CPU一级缓存中找到的有用数据占数据总量的80%,剩下的20%从二级缓存中读取。由于不能准确预测将要执行的数据,读取二级缓存的命中率也在80%左右(从二级缓存读到有用的数据占总数据的16%)。那么还有的数据就不得不从内存调用,但这已经是一个相当小的比例了。目前的较高端的CPU中,还会带有三级缓存,它是为读取二级缓存后未命中的数据设计的-种缓存,在拥有三级缓存的CPU中,只有约5%的数据需要从内存中调用,这进一步提高了CPU的效率。
为了保证CPU访问时有较高的命中率,缓存中的内容应该按一定的算法替换。一种较常用的算法是"最近最少使用算法"(LRU算法),它是将最近一段时间内最少被访问过的行淘汰出局。因此需要为每行设置一个计数器,LRU算法是把命中行的计数器清零,其他各行计数器加1。当需要替换时淘汰行计数器计数值最大的数据行出局。这是一种高效、科学的算法,其计数器清零过程可以把一些频繁调用后再不需要的数据淘汰出缓存,提高缓存的利用率。
CPU产品中,一级缓存的容量基本在4KB到64KB之间,二级缓存的容量则分为128KB、256KB、512KB、1MB、2MB等。一级缓存容量各产品之间相差不大,而二级缓存容量则是提高CPU性能的关键。二级缓存容量的提升是由CPU制造工艺所决定的,容量增大必然导致CPU内部晶体管数的增加,要在有限的CPU面积上集成更大的缓存,对制造工艺的要求也就越高。大量使用二级缓存带来的结果是处理器运行效率的提升和成本价格的大幅度不等比提升。举个例子,服务器上用的至强处理器和普通的P4处理器其内核基本上是一样的,就是二级缓存不同。至强的二级缓存是2MB~16MB,P4的二级缓存是512KB,于是最便宜的至强也比最贵的P4贵,原因就在二级缓存不同。
一次内存读取竟然要一万个时钟周期
好久没写技术文档了,今天试验了一下intel cpu的数据预取策略,随便写一个吧。核心程序片断如下:for(int i=0;i TEST_COUNT;i++)
{
int j=i*100;
__asm mov ebx,j;
nStartTime=RDTSC();
__asm mov edx,dword ptr a[ebx*4];
nInterval=RDTSC()-nStartTime;
printf("%d:%d:%dn",i,j,nInterval-nCost);
}
输出如下:Cost:100 0:0:13400 1:100:0 2:200:0 3:300:7040
4:400:0 5:500:0 6:600:0 7:700:10 8:800:0 9:900:0 10:1000:10 11:1100:0 12:1200:0 13:1300:6720 14:1400:10 15:1500:10
16:1600:0 17:1700:0 18:1800:10 19:1900:10 20:2000:10 21:2100:0 22:2200:0 23:2300:6500 24:2400:0 25:2500:10 26:2600:0 27:2700:10 28:2800:0 29:2900:10 30:3000:0 31:3100:10 32:3200:0 33:3300:24970 34:3400:10 35:3500:10 36:3600:10 37:3700:10 38:3800:0 39:3900:0 40:4000:10 41:4100:0 42:4200:0
43:4300:0 44:4400:9390 45:4500:10 46:4600:0 47:4700:10 48:4800:10 49:4900:0 50:5000:0 51:5100:0 52:5200:0 53:5300:0
54:5400:7820 55:5500:0 56:5600:0 57:5700:10 58:5800:10 59:5900:0 60:6000:0 61:6100:10 62:6200:0 63:6300:0 64:6400:8200 65:6500:0 66:6600:10 67:6700:10 68:6800:10 69:6900:0
70:7000:0 71:7100:10 72:7200:0 73:7300:10 74:7400:7800 75:7500:0 76:7600:10 77:7700:0 78:7800:0 79:7900:10 80:8000:10 81:8100:0 82:8200:10 83:8300:0 84:8400:0 85:8500:7610 86:8600:10 87:8700:0 88:8800:0 89:8900:10 90:9000:0 91:9100:0
92:9200:10 93:9300:0 94:9400:10 95:9500:8120 96:9600:0 97:9700:10 98:9800:10 99:9900:10 Miss 49/100其中,RDTSC是取CPU时钟周期的汇编指令,封装成一个函数了,其返回值是通过eax和edx两个寄存器返回的64位int;第一行Cost的数值100,是连续两次调用RDTSC之间的周期数,需要从统计中减去;而后的若干行,第一个数值是流水号,第二个是实际访问i的数组下标,第三个是内存读取指令消耗的cpu时钟周期数,已经减去了100;最后一行是100次访问中周期数不为零的次数统计,也就是cache未命中的次数统计。通过分析该统计结果,很容易看出,每隔大致一千个int,就会产生一个高峰。也就是说,cpu每次读取内存数据的时候,会将其后的4K
Bytes的数据同时读入cache中。并且,同时还会读取前面的4K数据,所以总共会读取8K的数据到缓存中。大致的结论有以下几点:1 netburst架构的内存数据预取策略非常简单,就是每次读取内存数据的时候,就顺便将附近的8K数据一起读到cache中。Intel的新的cpu架构Core Duo中,据说增加了一个新的数据预取管理器,可以分析读取数据的模式,根据寻找出的规律预取数据,这样就可以突破8K的限制了,而且可以减少cache中的无效数据,提高cache的利用率。2 cache miss的时候读取内存真的非常非常非常耗时,和我以前估计的几百个周期差了2个数量级。所以用心避免这种情况,对效率的提升应该是非常大的。比如,数组的访问速度就会比new出来的链表快非常多,因为数组在内存中是连续分布的。3由于每次从内存读取数据,都会载入8K的数据到cache中,而L2 ache的大小也就2M左右,所以,cache内数据的更新频率应该非常的快,估计没有数据可以在cache中存在一秒以上。每次运行测试程序时,第一次的耗时总是非常的高,即便上次测试只读了前100个数组成员。这一状况也很好的证明了这一点。4从第三点很容易推导出,大规模的内存复制,耗费的不仅仅是cpu周期,而且还会将cache中的数据冲击的面目全非。因此,新一代的intel cpu架构的北桥芯片,可以控制内存到内存的读写操作,这将大大提高系统的性能,既节省了cpu的时钟周期,也避免了破坏cache中的数据。测试环境:P4 2.66,512M DDR400,VS2005编译选项为默认的Release设置
发布者:admin,转转请注明出处:http://www.yc00.com/news/1688328506a120947.html
评论列表(0条)