为了追求PPA(高性能、低功耗和低成本),许多现代计算机系统和多核(处理器)芯片都支持共享硬件内存。在存在共享内存的存储器系统中,每个处理器都可以读写某个共享地址空间。
在支持共享内存之前最重要的是保证内存读写的正确性。这就涉及两个概念:内存一致性(Memory Consistency)和缓存一致性(Cache Coherence)
内存一致性(或者说内存模型、内存一致性模型),保证了不同处理器共享内存操作的一致性。内存一致性模型的复杂性主要来源于多个核心线程的同时load和store操作,并且这些操作还是out of order的。
内存一致性(Memory Consistency)
内存一致性根据loads 和stores 操作来定义正确的共享内存行为。首先举一个例子说明为什么需要内存一致性模型:某大学在网上发布课程表。假设计算机体系课程最初计划在152教室进行,在上课的前一天授课老师决定把课程调到252教室,并告诉网站管理员更新课程表。几分钟后网站管理员向所有学生发送一条短信,提醒检查新更新的课程表。不难想象存在这样一种场景:线上的课程表未及时得到更新、某些学生去了错误的房间。本质上,这涉及到了不同进程对共享内存请求的顺序问题。
内存一致性模型就是定义对于共享内存的哪些行为是正确或者说是允许的。这相当于给不同的进程建立一套规矩来保证各自请求到的数据都是正确的。
缓存一致性(Cache Coherence)
与内存一致性不同,缓存一致性是作为支持内存一致性模型的一部分。缓存一致性试图使共享内存系统的缓存(cache)数据与内存保持一致。也就是说内存一致性是从多核心的视角来看共享内存的一致性、而缓存一致性是cache和相应内存之间的一致性。
在讨论缓存一致性就需要考虑一个场景,即每个处理器核心或者说进程能够访问到多个数据副本(例如cache),cache中的数据和内存中的数据不一致也会存在功能性问题。
同样是上面的一个例子,某学生在最初查看在线课程时把152教室记录在了笔记本上(cache数据)。随后授课教师(网站管理员)更新线上课程表时,该学生的笔记本数据副本已经是错误的数据了,这就是所谓的缓存一致性问题。
同理,我们在项目中经常遇到的问题就是你和同事基于不同的代码版本从而run出不同的执行结果,原因就是坑爹的你或者你同事在本地修改了代码而没有上库,这就是。
简而言之,使用缓存一致性是为了防止同一个处理器看待内存和cache中数据不一致性、而内存一致性是为了防止不同处理器看待内存中数据的不一致性。
作者:XinXinHu
原文链接:https://mp.weixin.qq.com/s/Z3\_eDrWZkuqZT32t07QyhA
微信公众号:
授权转自数字芯片实验室公众号,请勿二次转载。
推荐阅读
更多数字IC设计技术干货等请关注数字芯片实验室专栏。