Linux 系统中缓存行cacheline

为了解决计算机系统中主内存与CPU之间运行速度差问题,会在CPU与主内存之间添加一级或者多级高速缓冲存储器(Cache)。
这个Cache一般是被集成到CPU内部的,所以也叫CPUCache,如图所示是两级Cache结构。

 

在Cache内部是按行存储的,其中每一行称为一个Cache行。Cache行是Cache与主内存进行数据交换的单位,
Cache行的大小一般为2的幕次数字节。

目前主流的CPUCache的CacheLine大小都是64Bytes。假设我们有一个512字节的一级缓存,那么按照64B的缓存单位大小来算,
这个一级缓存所能存放的缓存个数就是512/64=8个。具体参见下图:

 

CacheLine可以简单的理解为CPUCache中的最小缓存单位。

CPU访问某个变量时,首先会去看CPUCache内是否有该变量,如果有则直接从中获取,否则就去主内存里面获取该变量,
然后把该变量所在内存区域的一个Cache行大小的内存复制到Cache中。由于存放到Cache行的是内存块而不是单个变量,
所以可能会把多个变量存放到一个Cache行中。当多个线程同时修改一个缓存行里面的多个变量时,
由于同时只能有一个线程操作缓存行,所以相比将每个变量放到一个缓存行,性能会有所下降,这就是伪共享。
伪共享的产生是因为多个变量被放入了一个缓存行中,并且多个线程同时去写入缓存行中不同的变量。


那么为何多个变量会被放入一个缓存行呢?
其实是因为缓存与内存交换数据的单位就是缓存行,当CPU要访问的变量没有在缓存中找到时,根据程序运行的局部性原理,会把该变量所在内存中大小为缓存行的内存放入缓存行。
也就是地址连续的多个变量才有可能会被放到一个缓存行中。当创建数组时,数组里面的多个元素就会被放入同一个缓存行。
实在正常情况下单线程访问时将数组元素放入一个或者多个缓存行对代码执行是有利的,因为数据都在缓存中,代码执行会更快

getconf -a | grep CACHE

 

posted on 2023-02-18 16:58  寒魔影  阅读(375)  评论(0编辑  收藏  举报

导航