站长网 数码 分析CPU原理及伪共享

分析CPU原理及伪共享

随着工艺的提升,最近几十年 CPU 的频率不断提升,而受制于制造工艺和成本限制,目前计算机的内存在访问速度上没有质的突破。因此,CPU 的处理速度和内存的访问速度差距越来越大,甚至可以达到上万倍。这种情况下传统的 CPU 直连内存的方式显然就会因为内

随着工艺的提升,最近几十年 CPU 的频率不断提升,而受制于制造工艺和成本限制,目前计算机的内存在访问速度上没有质的突破。因此,CPU 的处理速度和内存的访问速度差距越来越大,甚至可以达到上万倍。这种情况下传统的 CPU 直连内存的方式显然就会因为内存访问的等待,导致计算资源大量闲置,降低 CPU 整体吞吐量。同时又由于内存数据访问的热点集中性,在 CPU 和内存之间用较为快速而成本较高(相对于内存)的介质做一层缓存,就显得性价比极高了。

为什么需要有CPU多级缓存

各种寄存器,用来存储本地变量和函数参数,访问一次需要1cycle,耗时小于1ns;

L1 Cache,一级缓存,本地 core 的缓存,分成 32K 的数据缓存 L1d 和 32k 指令缓存 L1i,访问 L1 需要3cycles,耗时大约 1ns;

L2 Cache,二级缓存,本地 core 的缓存,被设计为 L1 缓存与共享的 L3 缓存之间的缓冲,大小为 256K,访问 L2 需要 12cycles,耗时大约 3ns;

L3 Cache,三级缓存,在同插槽的所有 core 共享 L3 缓存,分为多个 2M 的段,访问 L3 需要 38cycles,耗时大约 12ns;

大致可以得出结论,缓存层级越接近于 CPU core,容量越小,速度越快,当 CPU 执行运算的时候,它先去 L1 查找所需的数据,再去 L2,然后是 L3,最后如果这些缓存中都没有,所需的数据就要去主内存拿。走得越远,运算耗费的时间就越长。

什么是缓存行

缓存行 (Cache Line) 便是 CPU Cache 中的最小单位,CPU Cache 由若干缓存行组成,一个缓存行的大小通常是 64 字节(这取决于 CPU),并且它有效地引用主内存中的一块地址。一个 Java 的 long 类型是 8 字节,因此在一个缓存行中可以存 8 个 long 类型的变量。

猜一下下面代码的执行时间:

public class ArrayLoop { 

 public static void main(String[] args) { 

 long[][] arr = new long[1024 * 1024][8]; 

 long sum = 0; 

 //横向遍历 

 long start = System.currentTimeMillis(); 

 for (int i = 0; i < 1024 *1024; i++) { 

 for (int j = 0; j < 8; j++) { 

 sum += arr[i][j]; 

 } 

 } 

 System.out.println("横向遍历耗时:" + (System.currentTimeMillis() – start) + "ms"); 

 //纵向遍历 

 start = System.currentTimeMillis(); 

 for (int i = 0; i < 8; i++) { 

 for (int j = 0; j < 1024 * 1024; j++) { 

 sum += arr[j][i]; 

 } 

 } 

 System.out.println("纵向遍历耗时:" + (System.currentTimeMillis() – start) + "ms"); 

本文来自网络,不代表站长网立场,转载请注明出处:https://www.tzzz.com.cn/html/yidong/sm/2021/0529/7586.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部