Cache Line

  • 作者: 雪山肥鱼
  • 时间:20210316 06:31
  • 目的:初步了解 cache
# 1. cache 缓存
# 2. L1 cache 结构
  # 2.1 对于24bit 的疑问
# 3. cache trashing 抖动
# 4. 缓存的一致性
# 5. False Sharing

相关阅读链接:
https://coolshell.cn/articles/20793.html 陈皓
https://github.com/haoel/cpu-cache 陈皓 git
https://blog.csdn.net/qq_27633421/article/details/106213665
本文尝试翻译:图片均来自于此帖子
https://manybutfinite.com/post/intel-cpu-caches/
缓存一致性MESI的链接:
https://www.scss.tcd.ie/Jeremy.Jones/VivioJS/caches/MESIHelp.htm

cache 缓存

cache与CPU.png

内存是DRAM,速度慢,容量大。属于CPU外部设备,通过总线与CPU进行通信。而cache 在 CPU内部,属于片上硬件。所以内存的速度会远远慢于cache.
到底差多少:


访问速度.png

L1的速度是RAM的27倍。L1,L2都是KB级别的,L3才MB。以Intel core i7-8700k(6core) 来说 每个核上有L1 = 64KB,L2 = 256KB,而共用的L3 = 2*6 = 12MB。

cache利用了时间/空间局部性原理,访问一个地址内容,可能近期也会访问。与此同时,也有可能访问这个内存周围的内存地址。
那么一块内存区域会被加到cache。距离CPU较近的叫做一级cache,较远叫做二级cache. 这只针对一颗CPU的core,L1/L2 cache 并不共享
也存在L3 cache 三级缓存,所有CPU的core 共享。

L1 cache 结构

cache的单位是cacheline,是一块连续的内存。以cacheline 64字节为例。所有的cacheline 又划到各个way旗下。

cache结构.png

row: 叫做set
columne: 叫做way
所以总共有512个cell,每个cell 64字节,L1 cache共32kb.
完全关联型cache, 一页内存可以放置在cache中的任意cell里。存储方便,但是查找起来开销太大。
set associate,利用地址的一些信息,在cache里找存储位置。如图中 第6位到第11位就是set 的 index.
但是 这一行的哪一个cell存储了 对应地址的数据呢?那么 就用到了24-bit tag值(这里我也没太明白为什么是24bits,难道是以处理器?原文:The processor can address 64GB)。比如物理内存64GB(2^36 = 64G, L1 cache 能映射64G的内存),那么每一页4kb,那么共有 2^24 pages,那么就需要24bit 来打tag(可以理解为1页1个tag),也就是说前24位相同,就分到同一个Way中。。
当CPU访问一个内存的时候,通过内存中间的6bits定位在哪个set,再通过24bits定位响应的cacheline。类似Hash table 一样,显示O(1)搜索,然后进入冲突里搜索。
硬件上的并行查找.png

确定了在哪个set后,在硬件的支持下,并行也就是同时在8个way里去寻找tag。找到则cache命中。(注意这里,cache只要命中了,就是命中64字节
否则转移到L2 cache, 若还没命中到L3 中去寻找。L2 L3的原理和L1一样的,只不过会大一些比如64KB,16ways.
总共有4096个row,每个way 有256Kb,总大小4M。18bits for tags, and 12bits for set index.

对于24bits的疑问:来自于陈皓(链接)博客的留言:

前24bits取决于CPU具体寻址设计.png

cache trashing cache 抖动

内存的一段数据由于被分配到了同一个set, 出现来了compete for same cache. 被频繁的换入换出。即使在cache 还没有用完的情况下还是会出现性能瓶颈。

缓存的一致性

指的是写到缓存了,那么在何时进行更新主存的动作。
可以在MESI的链接里进行学习。玩一下,挺有意思的。
所谓的MESI:

  • M Modified (一个core 已经对L1 cache 里的一块内存进行了修改)
  • E: Exclusive(独有的,只有这个core的L1 cache 存有这块内存的值)
  • S: Shared(其他core 也有)
  • I : Invalid (该处内存已经被其他core 修改了)
    实际上cache里的每一块 cacheline 附带一个状态机。在MESI里的连接点点就知道了。
    MESI升级:MOESI,可以从其他core中的缓存更新自己缓存的数据。
    MESIF:陈皓文章中有提到。一个core update缓存后会转发给其他core

False Sharing

用处:可以理解为性能调优,
举例:同一块 cacheline(64bytes)被不同的线程进行写操作。导致所有的线程都在不断地重新同步cahceline.导致多个线程跑不过一个线程。
代码来自陈皓的github:


优化前.png

优化后.png
  • 增加了线程独占的临时变量,对临时变量进行操作后,再对全局变量result[id] 进行刷新,大大降低了对全局变量的写入次数。
    暂时能想到的方案
  • 解决方案 1:多线程中使用局部变量
  • 解决方案 2:线程中的全局变量至少隔开一个cacheline,让cacheline之间不会叠加
  • 解决方案 3: 内存对齐
    理解: 真正理解false sharing 需要对MESI的玩法有所了解。
  • 对同一块cache不停的进行写操作,会增加cache之间更新缓存的花销。包括不停的去刷新主存的内容。缓存的cacheline的state machine 频繁的从 S -> I 状态
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容