基于4*4Torus结构的一级Cache的一致性协议的提案

2024-01-03 15:40

本文主要是介绍基于4*4Torus结构的一级Cache的一致性协议的提案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要:在带有一级Cache的多处理器系统中,由于不同处理器Cache对内存存储块的共享会产生一致性问题,并且随着多核处理器规模扩大愈加复杂,因此设计有效且高效一级Cache的一致性协议是很重要的。本文借鉴Token的思想,对目录表法加以改动提出了一种基于4*4Torus结构的Cache一致性协议。

1.引言

在共享内存的多处理器系统中,Cache结构可以将共享存储空间的数据缓存在本地,加速处理器获取数据的过程,但是由此也会带来严重的数据不一致现象。为了保证多处理器并行工作的正确性,高效的Cache一致性协议是必须的。

目前在多处理器系统中,较为典型的Cache一致性协议主要有监听法、目录表发、Token协议和Hammer协议[1]。这四种协议在不同情况下各有不同的优势,同时也存在比较明显的缺陷。因此,研究人员在此基础上提出了多种改进型协议。

2.Cache一致性协议概述

监听法通过共享总线向片内所有处理器进行消息广播,并需要时刻监听总线事务来更新本地数据的一致性状态,较为通用的有MESI和MOESI协议。但是监听法依赖于总线的完全顺序性,在处理器单元数较多时总线争用较为严重,且无法直接应用于无序互联结构,如Torus结构;且请求时需要向全体处理器单元广播消息,导致总线上通信量较大。

目录协议对共享存储器中的数据块设置目录项以跟踪、记录其状态信息,只需对需要的节点进行点对点通信而不需要广播消息。根据目录项的位置,可以分为集中式目录表法(Tang方法)和分散式目录表法[2,3]。依据目录项存储内容,可以分为全映射法、有限目录法和链式目录法。目录表法会增大Cache缺失延迟,并额外占用存储空间。有研究人员提出了一种使用两级目录的Cache一致性协议以减少额外存储[4,5],但在4*4Torus网中,使用两级目录并不能减少目录项占用的存储空间。

Token协议将一致性协议分为正确性框架和性能策略两层。正确性框架中的Token计数策略通过令牌的持有保证执行的安全性,持续性请求避免现象的发生。而在性能策略层可以选择高性能的协议来提升效率[6]。

3. 系统结构和基本思想说明

       本文基于4*4的Torus结构,借鉴Token的计数机制,对分散的全映射的目录表法的做了一些变动,提出了一种Cache一致性协议。

       本文所提出的Cache一致性协议所适用的多处理器系统结构如图2-1所示:使用4*4Torus结构作为互连结构连接16个处理器单元,每个处理器单元包含相连的处理器内核、一级Cache和通信接口。同时,互连结构与分散共享的内存(具有一致的地址空间)相连,该内存即为Home Memory。

图2-1

同时,需要对内存数据存储方式进行改动,为数据块添加特定标记位,具体见图2-2。数据块的前两bit用作状态标签,有00、01、10三种状态。接下来16bit用于存储对应16个处理器Cache的共享信息,如果对应的Cache保存有可用副本则设置为1,否则设置为0。最后在数据区存放数据。

图2-2

       之所以使用全映射目录而不是采用有限目录或者链式目录,因为对于16个处理器的系统,有限目录法和链式目录都无法减少目录项所额外消耗的内存空间,同时全映射法又可以很好的找到对应的Cache。且使用分散共享的Memory和分散式目录项可以有效减少目录查询所造成的时间延迟。

4、协议内容详述

       协议共使用三种状态:

       Invalid(00):该数据块不可用;

       Owner(01):该数据块是系统中唯一一个可用数据块,其他副本皆不可用,且与内存中数据不一致。

       Share(10):该数据块可用且系统中可能存在与该数据块相同的可用副本,且与内存中的数据一致。

在内存中,每个数据块标志位初始值为10(Share),且只可能存在Share和Invalid两种状态。

当本地CPU写时,如果Cache未命中,或者命中后数据块标志位为Invalid,则向Home Memory发出写请求。Home接收到写请求后,查找该数据块的标志位。如果该数据块的状态为Share,则直接向请求CPU返回数据、共享副本的数量值(Num),然后向其他共享者发送无效化消息,其他Cache将各自的副本置无效化后向请求者发送ACK,当请求者接受到Num个ACK后,将数据块的状态置为Owner,开始进行写操作。具体流程可见图3-1。如果该数据块的状态为Invalid,则检查目录项,向拥有者转发写请求信息,之后Owner将所有权转移给请求者。具体流程可见图3-2。如果Cache命中且状态为Owner,直接进行写操作即可。如果Cache命中,且状态为Share,则检查目录项,向其他所有共享者以及Home Memory发送无效化信息,获得ACK之后置为Owner状态,之后进行写操作,具体流程可见图3-3。


图3-1


图3-2


图3-3

当本地CPU读时,如果Cache未命中,或者命中后标志位为Invalid,则向HomeMemory发出读请求。Home接收到读请求后,查找该数据块的标志位。如果该数据块的状态为Share,则直接向请求者返回数据,置请求者状态为Owner,开始进行写操作,同时向其他共享者发送新共享消息以修改目录项。具体流程可见图3-4。如果该数据块的状态为Invalid,则检查目录项,向拥有者转发读请求信息,之后Owner将状态设置为Share,将数据发送给请求者,同时更新Home Memory。请求者接受到数据后即可进行读操作,具体流程可见图3-5。如果Cache命中且状态为Owner,直接进行读操作即可。如果Cache命中,且状态为Share,直接进行读操作即可。


图3-4


图3-5

在整个协议中,整体的状态迁移过程可以用图3-6来说明。其中,RW和RR分别代表其他处理器写操作和其他处理器读操作;LR和LW分别代表本地处理器读操作和本地处理器写操作。


图3-6

       综上所述,该协议的处理流程、状态转换和通信方式彼此是统一、自洽的,可以通过正常的状态转移和通信保证Cache的一致性。

5、协议评价和总结

       本文所提出的Cache一致性协议针对4*4Torus的互连结构,以分散式全映射目录表法为基础,并借用了Token协议中Token计数机制,即当需要进行写操作而本身Cache的状态不为Owner时,需要获得所有其他拥有者的无效化应答,才可以进行写操作。

       同时,本文所提出的一致性协议在维护Cache数据块一致性的同时,也保证有效数据块中目录项的一致性,同时借助本文协议中所设计的处理流程,对于所有可遇状况中的一半可以在第二步获取到所需要数据,少于基础目录表法的三步,同时使用分散目录表法减少了目录查询延迟。因此本文所提出的方法的数据缺失延迟多于监听法,但少于基础目录表法。当然,本协议可以直接用于Torus等无序结构,而监听协议不可以。

       当然,本方法会占用一定的存储空间,若一个数据块存放的数据量为16Byte,那么该方法造成的额外内存消耗为12.3%左右,是可以接受的,但是如果处理器的数目增加,会导致占用量迅速上升,也就是说该方法的扩展度有限。

       当然,本文提出的一致性协议并没有经过仿真实验,并且可能存在一些瑕疵,具体的效果有待验证。

 

 

参考文献:

[1]黄安文,张民选.多核处理器 Cache 一致性协议关键技术研究[J]. 计算机工程与科学, 2009, 31(A01): 104-108.

[2] Tang C K. Cache system design in the tightly coupledmultiprocessor system[C]//Proceedings of the June 7-10, 1976, national computerconference and exposition. ACM, 1976: 749-753.

[3] Censier L M, Feautrier P. A new solution to coherenceproblems in multicache systems[J]. Computers, IEEE Transactions on, 1978,100(12): 1112-1118.

[4] 王钰. 可缩放性Cache一致性协议分析[J]. 电光与控制, 1999 (2): 44-48.

[5]潘国腾, 窦强, 谢伦国. 基于目录的Cache 一致性协议的可扩展性研究[J]. 计算机工程与科学, 2008, 30(6): 131-133.

[6] 周川. 众核处理器中动态可重构 Cache 一致性协议的研究与实现[D]. 上海交通大学, 2013.

这篇关于基于4*4Torus结构的一级Cache的一致性协议的提案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/566211

相关文章

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

使用Spring Cache时设置缓存键的注意事项详解

《使用SpringCache时设置缓存键的注意事项详解》在现代的Web应用中,缓存是提高系统性能和响应速度的重要手段之一,Spring框架提供了强大的缓存支持,通过​​@Cacheable​​、​​... 目录引言1. 缓存键的基本概念2. 默认缓存键生成器3. 自定义缓存键3.1 使用​​@Cacheab