发明内容
为解决上述问题,本文提供了一种消息式内存访问装置及其访问方法。
本发明的目的是提高CPU内存通道的有效利用率,提出了一种消息式内存访问装置及其访问方法。
本发明公开了一种消息式内存访问装置,包括:
消息式命令总线,用于传输CPU生成的消息式访存指令,指示内存系统完成相应操作;
消息式内存控制器,用于将CPU的请求包装成消息包发送给存储模块,并解析存储模块返回的消息包将数据返给CPU;
消息通道,用于请求和应答消息包传送的通路;
存储模块,含有缓冲调度器,用于接收消息式内存控制器的请求包,完成相应的请求。
所述消息式命令总线还用于指定请求的访存长度,访存长度可大于或小于寄存器的长度;
请求的数据可返回至cache,或返回至CPU可寻址缓冲区,或不经cache返回至寄存器或寄存器组;
请求可附带数据访问优先级信息,用于指导消息式内存控制器和缓冲调度器中访存命令的调度,为内存系统提供调度依据。
所述消息式内存控制器还包括:
访存请求接口,用于CPU与消息式内存控制器进行请求交互的接口。
读写请求分配器,用于根据读写请求保留站的状态,控制能否将从访存请求接口接收到的访存请求插入到读请求状态表或是写请求状态表中,如果接收到的请求是写请求,则需要将写入到内存的数据暂存在写数据缓冲区中。
写数据缓冲区,用于暂存写请求的数据。
读数据缓冲区,用于暂存读请求的数据。
读写请求保留站,由读请求状态表和写请求状态表两部分组成,用于请求状态表为每个新接收的请求分配一个表项,在请求被缓冲调度器响应或是消息式内存控制器将请求响应给CPU时,请求状态表中对应的表项需要被更新或删除。
所述消息式内存控制器还包括:
请求生成与调度器,用于一方面根据请求状态表中请求的属性如请求长度和定时时延等生成多个小的请求;另一方面用于调度,从读请求状态表和写请求状态表中未完成的请求中选择下一时刻需要处理的请求。被选择的请求发送给消息打包器;
消息打包器,用于将一个或多个请求封装成消息通道上的消息包格式,并通过消息通道接口发送给缓冲调度器;
消息解包器,用于从消息包中抽取出一个或多个请求,以及解析每个请求对应的数据内容;
请求状态更新单元,用于根据消息解包器解析出来的请求及其数据,更新请求在读写请求保留站中的状态表,以及将数据暂存到读数据缓冲区;
请求响应控制器,用于向CPU发送请求的响应;
控制器配置接口,用于配置消息式内存控制器的参数,或是指定请求的属性,对某个请求或访存地址的配置,会将相应的值更新到读写请求状态表的属性中;
消息通道接口,用于与缓冲调度器互相传递消息包,针对消息通道的不同物理实现,消息通道接口也有对应的接口类型。
所述读写请求保留站中读请求状态表的条目号对应请求在请求状态表中的序号,消息式内存控制器和缓冲调度器的消息包中采用这个条目号来唯一指定被处理的请求,请求地址是待访问内存的首地址,定时时延指定了该请求需要返回给CPU的时间,通过控制器配置接口来设置的,返回粒度由消息式内存控制器每次返回给CPU的数据长度组成,数据状态是标识出已经从存储模块获取请求需要的数据,并标识出空数据,数据位置是标识已获取的请求数据存放在读数据缓冲区中的位置。
所述请求响应控制器还用于查询读写请求保留站中请求的状态,当CPU发送过来的请求被缓冲调度器和存储模块处理完成后,请求响应控制器向CPU发送请求的响应,如果是读请求被完成,则同时需要发送读数据缓冲区中请求对应的数据。
所述消息式内存控制器,与存储模块之间的交互是基于消息包完成的,还用于每个消息包包括一个或多个访存请求或应答的信息;消息包中的请求没有同步时序的限制,有请求返回的最大时延信息;
消息式内存控制器配置接口单元提供了消息式内存控制器特有的命令地址空间,允许对控制器的属性进行配置,允许设置访存请求的属性,可以发出相应的访存命令。
所述消息式内存控制器还用于对消息式内存控制器及命令地址空间通过相应的访存命令,支持内存系统定时推送数据至寄存器或可寻址高速缓冲区;支持在存储系统内部执行简单的算术逻辑运算和移动操作,并可设定访存的原子性,或批量执行;
读写请求保留站提供了读请求状态表和写请求状态表,每个被处理的请求都会在对应的读或写请求状态表中存在对应的表项,每个表项包括请求的地址和长度,包括请求的定时返回时延、返回粒度、数据状态和数据位置,在消息包中,每个请求都用其在请求状态表中唯一的条目号进行确定;
消息式内存控制器允许一个消息包包括了多个请求的信息,可以将每个请求分成一个或多个消息包传递到存储模块,还允许一个请求由存储模块通过一个或多个消息包来完成;
所述消息式内存控制器,多个请求或者一个请求的多个消息包之间可以乱序返回。
所述消息式内存控制器还用于如果一个读请求被多个存储模块的消息包应答时,请求对应的读请求状态表中的数据状态标识已返回的数据和未返回的数据;
未全部返回的数据可以存放在可寻址的缓冲区或是不可寻址的缓冲区,如果数据暂存在不可寻址的缓冲区,只有在请求的数据全部返回后,CPU的读请求才会被响应,同时请求的数据被发送给CPU;如果数据暂存在可寻址的缓冲区,CPU读取已返回的部分数据。
所述消息包类型包括:访存读/写请求包、特殊命令请求包、存储器状态查询包、和/或响应包。
所述存储模块中缓冲调度器包括:
消息通道接口,用于与消息式内存控制器互相传递消息包;
消息解包器,用于从收到的消息包中获取访存请求的信息,所述信息包括请求序列号、请求类型、请求语义信息、地址、数据,消息解包器在判断出请求类型后,将根据与该类型对应的规则完成解包操作;
请求分发器,用于将消息解包器解析出的访存请求分配到请求队列中,调度的参考依据包括每个请求的语义信息、要求的返回时间和访问数据粒度信息;
读写请求队列,用于缓存未完成的读写请求,含有优先级队列,高优先级队列中保存访问数据粒度小,返回时间要求短或是标记了高优先级的读写请求;低优先级队列中保存访问数据粒度大,返回时间要求长或是标记了低优先级的读写请求;
特殊请求队列,用于缓存未完成的非读写访存请求;
请求调度器,用于从请求队列中获取访存请求,转发给命令生成单元;从数据缓冲区获取访存返回数据,转发给消息打包器;
命令生成单元,用于获取调度后需要立即执行的访存请求,转化成具体的访问内存颗粒的命令,同时为了维护内存颗粒的状态,请求调度器会要求命令生成单元对内存芯片发出维护状态所需的命令;
消息打包器,用于从请求调度器获取返回数据,以及和数据对应的请求序列号,生成响应包传回给消息式内存控制器,根据请求调度器对返回数据的标记,也允许多个请求的返回数据合并成一个响应包传给消息式内存控制器;
数据缓冲区,用于缓存访问内存芯片返回的数据,由请求调度器选取需要的数据,再提交给消息打包器;
内存芯片接口,用于从命令生成单元接收访问内存芯片的命令,发送给存储模块上的内存芯片,收到返回数据后,存入数据缓冲区。
所述存储模块中缓冲调度器还包括:
定时器,用于根据需要输出不同时间间隔的脉冲,给请求调度器和状态维护单元提供所需的时钟触发;
状态维护单元,用于维护与缓冲调度器相连的各个内存颗粒的状态,发出预充电和/或刷新命令。
所述请求调度器还用于根据请求的情况完成高优先级队列中的访存请求操作,将多个请求加上合并标记,所返回数据全部到达数据缓冲区后,一起转给消息打包器打包成一个响应包,对低优先级队列中的访存数据量比较大的请求,则可以将一个请求拆分成几步完成,每完成一步都将结果转发给消息打包器返回一个响应包。
所述存储模块还用于对于一个消息式内存控制器发来的访存请求,可以分多步完成并返回多个消息包应答这一个请求;对于多个消息式内存控制器发来的访存请求,可以在完成所有请求后合并成一个消息包应答多个请求;可以调度消息式内存控制器发来的访存请求的执行顺序,调度依据包括请求的优先级、语义信息以及存储模块上内存芯片的状态。
所述存储模块的存储单元为同步式内存颗粒和/或异步网络连接的内存颗粒。
其特征在于,所述缓冲调度器支持的特殊消息式访存指令包括:定时推送指令、存储模块内部的简单算术逻辑运算和移动指令、压缩存储。
所述消息通道用于传输以消息包为单位的消息,采用并行总线、点对点串行总线或拓扑结构的网络。
本发明还公开了一种消息式内存访问方法,包括如下步骤:
步骤1001,CPU发出访存请求,CPU可以指定该请求的访问数据的长度、优先级以及语义信息,该请求还可以是除读、写之外其他复杂访存请求;
步骤1002,判断该请求是否含有配置消息式内存控制器的信息,如果含有则进入步骤1003,否则进入步骤1004;
步骤1003,如果请求中含有配置消息式内存控制器的信息,则消息式内存控制器根据配置信息作出适当调整,进行调度并处理请求;
步骤1004,消息式内存控制器将CPU的访存请求封装为消息包,封装的过程中可以将多个请求封装在一个包中,封装完成的包通过消息通道发送给相应存储模块的缓冲调度器,并根据需要在读写请求保留站中进行记录;
步骤1005,存储模块中的缓冲调度器对发送的消息包进行解析,对CPU请求进行操作;
步骤1006,该CPU请求完成后,如果其在消息式内存控制器读写请求保留站内有记录,则消除该记录。
所述步骤1006之前还包括:
步骤1007,如果该CPU请求是读请求,则将读回的数据封装为响应包,通过消息通道发送给消息式内存控制器,封装响应包时,可根据需求将一个请求返回的数据拆分封装为多个响应包,也可多个请求返回的数据合并封装为一个响应包;
步骤1008,消息式内存控制器接收到响应包,进行解析,根据需要将响应包中的数据存储在cache或消息式内存控制器的内部可寻址缓冲区内;
步骤1009,消息式内存控制器判断该CPU请求的响应包是否全部返回,如果全部返回则进入步骤1006,如果不是则进入步骤1008。
所述步骤1005之后还包括:
步骤1010,缓冲调度器收到消息式内存控制器发送的消息包,进行解析,并将CPU请求填入适当的请求队列;
步骤1011,缓冲调度器内的请求调度器根据CPU请求的优先级和语义信息对多个请求队列里的请求进行调度,安排请求的执行顺序;
步骤1012,将被调度执行的CPU请求转化为一系列符合内存颗粒标准的命令,发送给内存接口;
步骤1013,判断该CPU请求是否为复杂访存请求,如果是则进入步骤1014,如果不是则进入步骤1016;
步骤1014,如果该CPU请求为复杂访存请求,缓冲调度器内的处理逻辑对从内存返回的数据进行简单的处理;
步骤1015,复杂访存指令被处理之后,根据请求的类别,选择是否需要将处理后的数据写回内存,是否需要将处理后的数据返回给CPU,如果需要写回内存,则通过一系列符合内存颗粒标准的命令写入内存,如果需要返回给CPU,则将数据封装为响应包,发送给消息式内存控制器;
步骤1016,如果该CPU请求不是复杂访存请求,则判断是否为写请求,如果是则进入步骤1006,如果不是则进入步骤1007。
所述步骤1004还包括如下步骤:
步骤1101,消息式内存控制器从访存请求端口接收CPU发送的读写请求;
步骤1102,读写请求分配器判断请求是否是读请求。如果是读请求,跳转到步骤1104;否则,跳转到步骤1103;
步骤1103,如果收到的请求是写请求,判断写请求状态表是否存在空项。如果写请求状态表存在空项,则跳转到步骤1105;否则,跳转到步骤1102;
步骤1104,如果收到的请求是读请求,判断读请求状态表是否存在空项。如果读请求状态表存在空项,则跳转到步骤1106;否则,跳转到步骤1102;
步骤1105,如果收到的请求是写请求,而且写请求状态表存在空闲的表项,则为该请求分配一个表项,并将写请求中的数据存入到写数据缓冲区;否则,跳转到步骤1102;
步骤1106,如果收到的请求是读请求,而且读请求状态表存在空闲的表项,则为该请求分配一个表项;否则,跳转到步骤1102;
步骤1107,结束本次请求的接收,并继续处理从访存请求接口接收到的请求。
所述消息式内存控制器调度并处理请求包括如下步骤:
步骤1201,请求生成与调度器扫描读写请求状态表的表项;
步骤1202,请求生成与调度器查询读写请求状态表中是否有未完成而需要被处理的请求。如果有未完成的表项,跳转到步骤1203;否则,跳转到步骤1201;
步骤1203,如果存在未完成的请求,请求生成与调度器根据请求在对应请求状态表中的属性,将一个大的请求划分成多个小的请求,并根据调度算法选择下一时刻被选择处理的请求;
步骤1204,判断待处理的请求是否是读请求。如果是读请求,跳转到步骤1206;否则,跳转到步骤1205;
步骤1205,如果待处理的请求是写请求,需要从写数据缓冲区中获取该请求对应的数据;否则,直接跳到步骤1206;
步骤1206,消息打包器将一个或多个请求封装是消息包的格式;
步骤1207,将打包后的消息发送给消息式内存控制器与缓冲调度器的消息通道接口;并转入到步骤1201继续下一轮的处理。
所述步骤1013还包括下列步骤:
步骤1301,解析从缓冲调度器发送到消息式内存控制器的响应包的包头信息,获取包头内响应的个数以及每个响应长度,用于下面逐个解析响应;
步骤1302,判断是否还有下一个响应需要解析,如果有,则进入步骤1303解析下一个响应;否则本次解析响应包结束;
步骤1303,解析下一个响应的类型和请求标识,下面需要根据不同的响应类型分别进行不同的处理;
步骤1304,判断是否为访存读请求响应,如果是,则进入步骤135进一步解析;否则得到的是存储器状态查询请求响应或访存写请求响应,进入步骤1306获取对应状态信息;
步骤1305,根据包头指示的该响应长度,寻址到响应,并从访存读请求响应中获取返回的数据;
步骤1306,根据包头指示的响应长度寻址到响应,如果是状态查询请求响应,则从中获取返回的状态值;如果是访存写请求响应,则更新写请求状态表中该请求的属性,至此解析本响应结束,回到步骤1302;
步骤1307,根据包内是否含有子响应判断返回的访存读请求数据是否被缓冲调度器拆分成多个响应返回。如果没有被拆分成多个子响应,则完成本次访存读请求,进入步骤1309;如果被拆分,则解析获取子响应的个数和当前子响应的标识,进入步骤1308;
步骤1308,判断本次响应是否为访存读请求的最后一个子响应,判断的依据是本次子响应标识是否等于子响应个数。如果是,那么完成本访存读请求,进入步骤1309;否则访存读请求还未完成,将本次返回的子响应数据写入到对应的数据缓冲中,并更新该请求在读请求状态表中的数据状态和数据位置等信息,回到步骤1302;
步骤1309,完成本访存读请求,之后就可以准备将数据从消息式内存控制器传回到CPU,回到步骤1302。
所述步骤1006还包括如下步骤:
步骤1401,请求响应控制器扫描读写请求状态表;
步骤1402,查询写请求状态表中是否有已完成的请求。如果有,跳转到步骤1404;否则,跳转到步骤1403;
步骤1403,如果写请求状态表中没有已完成的请求项,则查询读请求状态表中是否有已完成的请求项,如果有,跳转到步骤1404;否则,跳转到步骤1402;
步骤1404,如果写请求状态表或读请求状态表中有已完成的请求,则判断已完成的请求是否满足请求属性的要求,如果满足,跳转到步骤1405;否则,跳转到步骤1402;
步骤1405,向CPU发送满足所有属性的请求的响应,响应的数据内容也需要与请求的返回粒度等属性匹配。
所述步骤1011还包括如下步骤:
步骤1501,定时器根据设置好的条件,触发请求调度器,准备开始一次新的请求调度;
步骤1502,检查此次触发条件是否为芯片状态维护请求,若是执行步骤1503,否则执行步骤1504;
步骤1503,本次定时器触发的条件是需要进行芯片状态维护,发出芯片状态维护命令,转到步骤1509;
步骤1504,检查此次触发条件是否要求处理特殊请求队列,若是执行步骤1505,否则执行步骤1506;
步骤1505,本次定时器触发的条件是需要处理特殊请求队列,读入特殊请求队列中的请求,转化成一序列的读写操作。修改队列中的请求状态或是在请求完成后移除。转到步骤1509;
步骤1506,检查此次触发条件是否要求处理优先级最高的读写请求队列,若是执行步骤1507,否则执行步骤1508;
步骤1507,本次定时器触发的条件是需要处理优先级最高的读写请求队列,移除队列中的所有请求,并对所有的读请求标上合并标记。转到步骤1509;
步骤1508,本次定时器触发的条件是需要处理非最高优先级的读写请求队列,访问对应优先级请求队列中的请求,根据读写请求当前的状态生成需要的读写操作。修改队列中的请求状态或是在请求完成后移除。转到步骤1509;
步骤1509,本次请求调度结束,等待下一次定时器触发。
本发明的有益效果为:通过改变原有同步式访存体系结构,用异步的请求和应答消息取代传统的同步式总线事务,为访存体系结构和应用访存接口增加更多的并发性和灵活性,从而提高CPU内存通道的利用率。
具体实施方式
下面给出本发明的具体实施方式,结合附图对本发明做出了详细描述。
本发明的目的是提高CPU内存通道的有效利用率,提出了一种基于消息的内存访问装置。
本发明的出发点是,即使物理带宽受限,也同样可以通过提高利用率来增加有效的带宽。而传统的内存系统采用的一种固定延迟、固定粒度、被动式的同步顺序访存体系,限制了可能的有效技术手段的应用。
本发明将研究一种新型的基于“消息”(message)式的体系结构,通过改变原有访存体系结构,用异步、并发的请求和应答消息取代传统的同步式总线事务,为访存体系结构和应用访存接口增加更多的灵活性,提高CPU内存通道的利用率。
本发明提出的一种消息式内存访问装置,包括:
消息式命令总线,用于传输CPU生成的消息式访存指令,指示内存系统完成相应操作;
消息式内存控制器,用于将CPU的请求包装成消息包发送给存储模块,并解析存储模块返回的消息包将数据返给CPU;
消息通道,用于请求和应答消息包传送的通路;
存储模块,含有缓冲调度器,用于接收消息式内存控制器的请求包,完成相应的请求。
所述消息式命令总线,可以指定请求的访存长度,访存长度可大于或小于寄存器的长度;
所述消息式命令总线,请求的数据可返回至cache,或返回至CPU可寻址缓冲区,或不经cache返回至寄存器或寄存器组;
所述消息式命令总线,请求可附带数据访问优先级信息,用于指导消息式内存控制器和缓冲调度器中访存命令的调度,为内存系统提供调度依据;
所述消息式内存控制器,与存储模块之间的交互是基于消息包完成的。每个消息包允许包括一个或多个访存请求的信息或是数据;消息包中的请求没有同步时序的限制,但可以包括请求返回的最大时延等信息。
所述消息式内存控制器,控制器配置接口单元提供了消息式内存控制器特有的命令地址空间,允许对控制器的属性进行配置,也允许设置访存请求的属性,如设置访存请求定时返回的时延和粒度等,也可以发出特有的访存命令。
所述消息式内存控制器及命令地址空间,可以通过特有命令,支持内存系统定时推送数据至寄存器或可寻址高速缓冲区;支持在存储系统内部执行简单的算术逻辑运算和移动操作,并可设定访存的原子性,或批量执行。
所述的消息式内存控制器,读写请求保留站单元提供了读请求状态表和写请求状态表。每个被处理的请求都会在对应的读或写请求状态表中存在对应的表项。每个表项不仅包括了请求的地址和长度,还包括了请求的定时返回时延、返回粒度、数据状态和数据位置等附加属性。在消息包中,每个请求都用其在请求状态表中唯一的条目号确定。
所述的消息式内存控制器,消息式内存控制器不仅允许一个消息包包括了多个请求的信息,也可以将每个请求分成一个或多个消息包传递到存储模块,还允许一个请求由存储模块通过一个或多个应答信息包来完成。
所述消息式内存控制器,多个请求或者一个请求的多个应答消息包之间可以乱序返回。
所述消息式内存控制器,如果一个读请求被多个存储模块的消息包应答时,请求对应的读请求状态表中的数据状态标识已返回的数据和未返回的数据。未全部返回的数据可以存放在可寻址的缓冲区或是不可寻址的缓冲区。如果数据暂存在不可寻址的缓冲区,只有在请求的数据全部返回后,CPU的读请求才会被响应,同时请求的数据被发送给CPU;如果数据暂存在可寻址的缓冲区,CPU能够地读取已返回的部分数据,而不用等待所有的数据都访问。
所述消息包,可以包含访存的语义信息,包括但不限于线程信息、对象信息、优先级信息。
所述消息通道,传输以消息包为单位,可以是并行总线、点对点串行总线或其他拓扑结构的网络。
所述含缓冲调度器的存储模块,对于一个消息式内存控制器发来的访存请求,可以分多步完成并返回多个消息包应答这一个请求。
所述含缓冲调度器的存储模块,对于多个消息式内存控制器发来的访存请求,可以在完成所有请求后合并成一个消息包应答多个请求。
所述含缓冲调度器的存储模块,可以调度消息式内存控制器发来的访存请求的执行顺序,调度依据包括请求的优先级、语义信息以及存储模块上内存芯片的状态。
所述含缓冲调度器的存储模块,缓冲调度器支持除load/store外的特殊消息式访存指令:包括但不限于定时推送指令、存储系统内部的简单算术逻辑运算和移动指令(支持原子操作和批量处理)、压缩存储。
所述含缓冲调度器的存储模块,存储模块中的存储单元既可以是同步式内存颗粒,也可以是基于异步网络连接的内存颗粒。
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明的一种消息式内存访问装置及基于消息的内存访问方法进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
如图1所示,消息式内存访问装置包括消息式命令总线110、消息式内存控制器120、消息通道130以及含缓冲调度器的存储模块140;这些功能单元通过消息包完成CPU对内存访问,实现了可控延迟,可变粒度,支持语义信息的消息式访存。
其中,CPU通过访存指令或者对特殊命令地址空间的访问转化为消息式命令总线110上的消息式访存请求。相比传统Load、Store访存指令,消息式内存访问装置允许CPU指定访存的数据粒度大小、速度、返回数据的时机和方式等语义信息。
消息式内存控制器120调度收到的访存请求,将其转换成请求包放到消息通道130上,维护所有处理中的访存请求状态。当解析消息通道130上传回的响应包时,解响应包获取访存请求的返回数据。
存储模块140通过缓冲调度器接收处理消息通道130上的请求包,解析请求并访问具体的内存芯片,将需要返回的数据打包成响应包传回给消息式内存控制器120。
消息式命令总线110上支持的消息式访存指令主要分三类:
1.消息式内存存取指令,为普通的内存存取指令附加粒度和优先级参数。CPU先在特殊命令地址空间的规定位置设置好访存的数据大小和访问优先级,然后执行消息式内存存取指令。即可按照需要的优先级将指定长度的数据从内存中取出放于cache中。
2.定时返回指令,允许在将来的一段时间内,每隔固定的时间间隔,存储系统会把指令指定数组的一个数据返回到指定的寄存器中。CPU先在特殊命令地址空间的规定位置设置好访存的时间间隔和返回次数,然后执行定时返回指令即可。执行该指令时,由消息式内存控制器或缓冲调度器定时产生需要的读取命令,将其插入命令队列或请求队列中。存储系统返回的数据不经cache,直接送入寄存器中。相对于预取,定时返回减少了buffer占用。
3.存储系统内部的简单算术逻辑运算和拷贝指令,支持原子性和批量处理。该指令使存储系统可以不经CPU对存储单元完成一些简单的算术逻辑运算(加、减、与、或、异或等,运算结果写入存储单元)和拷贝。该指令支持批量处理。需要在特殊命令地址空间的规定位置设置好指令的参数,如存储系统要执行的操作类型、是否为原子操作,批量处理的操作次数等。然后执行指令MOPR1,R2,R3。其中R1和R2存储源操作数的地址,R3存储目的操作数的地址。执行该指令时,由缓冲调度器或消息式内存控制器来执行运算和拷贝,保证操作的原子性,控制操作次数。简单的操作不用把数据移动到CPU,减少了访存总量。
在消息式内存控制器120和存储模块140之间通过消息包进行相互通信,支持的消息包类型包括访存读/写请求包,特殊命令请求包,存储器状态查询包,以及响应包。如图2所示,一个消息包200包含一个包头202,一个或多个访存请求或响应204、206、208。包头202指示消息包的元数据,比如包类型、请求个数、每个请求的长度、包长度、容错信息等。对于从消息式内存控制器发送到存储模块的访存读/写请求包,包内可以包含一个或多个访存读/写请求,每个访存请求202、204、206包含请求标识、访存地址、访存粒度、访存操作,还可以包含一些语义信息,对于写请求还包含数据;而对于从存储模块发送回消息式内存控制器的响应包,包内可以包含一个或多个响应,每个响应包中包含请求标识,返回的数据等。
每个消息包都必须包含一个包头300,如图3所示,包头信息包括:包类型302,源模块标识304,目的模块标识306,包含的请求/响应个数308,每个请求/响应的长度310、312、314,包长度316,以及整个包的容错信息318。其中,包类型302用于指示总线上传输的包的类型,支持的包类型包括访存读/写请求包,特殊命令请求包,存储器状态查询包,以及响应包。源模块标识304指示发送该消息包的模块(消息式内存控制器或存储模块)号,比如对于包含多个消息式内存控制器的系统,这个域可用于指示发送访存读/写请求的消息式内存控制器标识。目的模块标识306指示负责接收处理该包请求的模块(消息式内存控制器或存储模块)号。请求/响应个数308指示该包中包含的请求或响应的个数,注意这里包含的多个请求必须都是与包类型匹配的,比如包类型为访存读请求包,那么这里的多个请求必须都是访存读请求。每个请求/响应长度310、312、314用于指示每个请求或响应的大小,利用这个信息可以寻址到包内每个请求或响应的位置(偏移量)。包长度316指示整个消息包的长度。包容错信息318指示包在总线上传输过程中是否出错,可以但不局限于使用奇偶校验(Parity),校验和(Checksum)和纠错码(ECC)等容错技术。
访存读/写请求包被用于消息式内存控制器向存储模块发送一个或多个访存读/写请求400,除了包头外,如图4所示,每个访存读/写请求400包括:请求标识402、操作码404、访存地址406、访存粒度408、还可以包含语义信息410,对于访存写请求还包含数据412。请求标识402为消息式内存控制器分配给每个请求的唯一标识。操作码404指示访存请求的操作如读请求,写请求等。访存地址406指示访存请求的起始物理地址。访存粒度408指示访存请求数据的粒度(或长度),比如可以为小粒度的8B,也可以为大粒度的4KB。语义信息410指示CPU经过消息式内存控制器传送到存储模块的程序运行时信息,用于指导存储模块内缓冲调度器的调度,比如访存请求的优先级,访存请求完成的超时时间(Timeout),发送访存请求的CPU核标识(CoreID)等。对于访存写请求,还包含数据412,指示将被写入到指定物理地址的数据。
特殊命令请求包用于从消息式内存控制器向存储模块发送特殊处理的命令,如简单算术逻辑运算、移动、原子操作、压缩等。
存储器状态查询包用于消息式内存控制器向存储模块查询多种状态信息。每个存储器状态查询包只包含一个查询请求,所以它的包头内请求个数总是设置为1。如图5所示,每个状态查询请求500包括:状态查询类型502和状态查询标识504。状态查询类型502指示查询的存储模块状态的类型,如读写请求队列是否已满,特殊请求队列是否已满,内存芯片是否处于低功耗状态等。状态查询标识504为消息式内存控制器分配的状态查询请求标识,用于消息式内存控制器收到来自存储模块的响应后,寻址状态查询请求。
响应包用于存储模块向消息式内存控制器发送一个或多个返回的响应,除了包头外,如图6所示,每个响应600包括:响应类型602、请求标识604、还可能包含子响应个数606、子响应标识608、数据610或者状态值612。响应类型602指示针对不同类型请求返回的对应响应,如访存读请求响应,状态查询请求响应等。请求标识604为响应对应的请求标识,如访存读请求标识,状态查询请求标识。对于访存读请求响应,如果请求的为大粒度数据,则存储模块发送回响应的时候可能将单个请求的数据分割成多个子响应返回,这多个子响应可以放在同一个响应包内,也可以分散到多个响应包内分别返回,此时子响应个数606用于指示分割的子响应个数,而子响应标识608为当前返回子响应的标识。如果消息式内存控制器从一个或多个响应包内获取到指定个数的子响应,才完成该访存读请求。对访存读请求响应还包括从存储模块读回到消息式内存控制器的数据610。而对于状态查询请求响应,则还包括返回的存储器对应的状态值612,如读写请求队列已满。
如图7所示,消息式内存控制器包括访存请求接口700、读写请求分配器单元701、写数据缓冲区单元702、读数据缓冲区单元703、读写请求保留站704、请求生成与调度器单元705、消息打包器706、消息解包器707、请求状态更新单元708、请求响应控制器709、控制器配置接口710及消息通道接口711。上述单元实现的消息式内存控制器,通过消息包的方式与缓冲调度器及其存储模块单元进行交互完成请求的处理;而且,它支持对变粒度的、限定返回时机的访存请求进行处理。另外,它允许同一个读请求的数据通过多个消息包以乱序的方式返回,这样能够提高内存带宽的利用率。
访存请求接口700是CPU与消息式内存控制器进行请求交互的接口。这个接口用于CPU向消息式内存控制器发送访存请求,也用于消息式内存控制器向CPU发送访存请求的响应;另外,这个接口也可以传送用于配置消息式内存控制器的命令。
读写请求分配器单元701根据读写请求保留站的状态,如消息式内存控制器所能容纳的剩余访存请求数,控制能否将从访存请求接口接收到的访存请求插入到读请求状态表或是写请求状态表中,如图8所示。如果接收到的请求是写请求,则需要将写入到内存的数据暂存在写数据缓冲区702中。
写数据缓冲区单元702用于暂存写请求的数据。当在该写请求被调度时,该请求对应的数据需要填充在发送到缓冲调度器的消息包中。
读数据缓冲区单元703用于暂存读请求的数据。由于消息式内存控制器允许一个请求的数据以多个消息包的方式返回,读数据缓冲区的数据可能只是请求所需数据的一部分,而且是乱序的。读请求状态表记录了每个请求已返回的数据块和其在读数据缓冲区中的数据位置。另外,消息式内存控制具有请求定时返回的功能;这样,即使一个请求的数据已全部暂存在读数据缓冲区中,请求也可能不会立即返回。
读写请求保留站单元704是控制和管理请求的关键单元;它由读请求状态表和写请求状态表两部分组成。请求状态表为每个新接收的请求分配一个表项。在请求被缓冲调度器响应或是消息式内存控制器将请求响应给CPU时,请求状态表中对应的表项需要被更新或是删除。
读请求状态表的每个表项如图8所示。条目号对应请求在请求状态表中的序号。消息式内存控制器和缓冲调度器的消息包中采用这个条目号来唯一指定被处理的请求。请求地址是待访问内存的首地址。与现有消息式内存控制器固定的访存请求长度不同,消息式内存控制器处理变长的请求来提高内存带宽的有效性。定时时延指定了该请求需要返回给CPU的时间,它主要是通过控制器配置接口来设置的。返回粒度是指消息式内存控制器每次返回给CPU的数据长度。数据状态标识请求需要的数据有哪些已经从存储模块获取,哪些仍是空。数据位置标识已获取的请求数据存放在读数据缓冲区中的位置。
请求生成与调度器单元705一方面根据请求状态表中请求的属性如请求长度和定时时延等生成多个小的请求;另一方面用于调度,从读请求状态表和写请求状态表中未完成的请求中选择下一时刻需要处理的请求。被选择的请求发送给消息打包器706。
消息打包器706用于将一个或多个请求封装成消息通道上的消息包格式,并通过消息通道接口发送给缓冲调度器。
消息解包器707用于从消息包中抽取出一个或多个请求,以及解析每个请求对应的数据内容。
请求状态更新单元708根据消息解包器707解析出来的请求及其数据,更新请求在读写请求保留站704中的状态表,以及将数据暂存到读数据缓冲区。
请求响应控制器709用于向CPU发送请求的响应。它主要是查询读写请求保留站704中请求的状态。当CPU发送过来的请求被缓冲调度器和存储模块处理完成后,请求响应控制器709向CPU发送请求的响应。如果是读请求被完成,则同时需要发送读数据缓冲区703中请求对应的数据。
控制器配置接口710用于配置消息式内存控制器的参数,或是指定请求的属性,如定时时延等。对某个请求或访存地址的配置,会将相应的值更新到读写请求状态表的属性中。
消息通道接口711用于与缓冲调度器互相传递消息包。针对消息通道的不同物理实现,消息通道接口711也有对应的接口类型。比如共享式的并行总线接口或是点到点的串行总线接口。
图9是存储模块中缓冲调度器的结构示意图。如图9所示,缓冲调度器包括了消息通道接口901、消息解包器902、请求分发器903、读写请求队列904、特殊请求队列905、定时器906、状态维护单元907、请求调度器908、命令生成单元909、消息打包器910、数据缓冲区911、内存芯片接口912。
所述缓冲调度器,可以是存储模块上一个独立的集成电路芯片,与存储模块上的内存颗粒相连。也可以是系统主板上的一个芯片,与通用存储模块相连。缓冲调度器可以通过各种硬件方式实现,如专用集成电路芯片,可编程逻辑设备,现场可编程门阵列等。尽管下文描述的缓冲调度器是依照图展开的,通过其他方式实现的示例也是同样适宜的,例如增加额外的模块或是合并里面的某些功能单元。
消息通道接口901用于与消息式内存控制器互相传递消息包。针对消息通道的不同物理实现,消息通道接口901也有对应的接口类型。比如共享式的并行总线接口或是点到点的串行总线接口。
消息解包器902从收到的消息包中获取访存请求的各种信息,包括请求序列号、请求类型、请求语义信息、地址、数据等。不同的请求类型有不同的消息包格式,消息解包器902在判断出请求类型后,将根据与该类型对应的规则完成解包操作。
请求分发器903将消息解包器902解析出的访存请求分配到不同的请求队列中。调度的参考依据包括每个请求的语义信息、要求的返回时间和访问数据粒度等信息。
读写请求队列904,缓存未完成的读写请求,含有多个优先级队列。高优先级队列中保存访问数据粒度小,返回时间要求短或是标记了高优先级的读写请求;低优先级队列中保存访问数据粒度大,返回时间要求长或是标记了低优先级的读写请求。
特殊请求队列905,缓存未完成的非读写访存请求。比如对数据的逻辑运算,压缩,移动等操作。
定时器906可根据需要输出不同时间间隔的脉冲,给请求调度器908和状态维护单元907提供所需的时钟触发。
状态维护单元907,用于维护与缓冲调度器相连的各个内存颗粒的状态,在需要的时候发出预充电、刷新等命令。
请求调度器908从请求队列中获取访存请求,转发给命令生成单元909;从数据缓冲区获取访存返回数据,转发给消息打包器910。请求调度器908除了转发请求和返回数据外,还可根据请求的情况完成一系列特殊操作。如高优先级队列中的访存请求通常访问粒度比较小,所以可以将多个请求加上合并标记,这样在它们的返回数据全部到达数据缓冲区后,一起转给消息打包器910打包成一个响应包。对低优先级队列中的访存数据量比较大的请求,则可以将一个请求拆分成几步完成,每完成一步都将结果转发给消息打包器910返回一个响应包。
命令生成单元909获取调度后需要立即执行的访存请求,转化成具体的访问内存颗粒的命令。同时为了维护内存颗粒的状态,请求调度器908也会要求命令生成单元909对内存芯片发出维护状态所需的命令。
消息打包器910从请求调度器908获取返回数据,以及和数据对应的请求序列号,生成响应包传回给消息式内存控制器。根据请求调度器908对返回数据的标记,也允许多个请求的返回数据合并成一个响应包传给消息式内存控制器。
数据缓冲区911缓存访问内存芯片返回的数据,由请求调度器908选取需要的数据,再提交给消息打包器910。
内存芯片接口912从命令生成单元909接收访问内存芯片的命令,发送给存储模块上的内存芯片,收到返回数据后,存入数据缓冲区911。
如图10所示,一种消息式内存访问方法包括以下步骤:
步骤1001,CPU发出访存请求,CPU可以指定该请求的访问数据的长度、优先级以及语义信息,该请求还可以是除读、写之外其他复杂访存请求,如定时访问、简单算术逻辑运算、移动、原子操作、压缩等;
步骤1002,判断该请求是否含有配置消息式内存控制器的信息,如果含有则进入步骤1003,否则进入步骤1004;
步骤1003,如果请求中含有配置消息式内存控制器的信息,则消息式内存控制器根据配置信息作出适当调整;
步骤1004,消息式内存控制器将CPU的访存请求按一定的格式封装为消息包,封装的过程中可以按一定规则将多个请求封装在一个包中,封装完成的包通过消息通道发送给相应存储模块的缓冲调度器,并根据需要在读写请求保留站中进行记录;
步骤1005,缓冲调度器收到消息式内存控制器发送的消息包,进行解析,并将CPU请求填入适当的请求队列;
步骤1006,缓冲调度器内的请求调度器根据CPU请求的优先级和语义信息对多个请求队列里的请求进行调度,安排请求的执行顺序;
步骤1007,将被调度执行的CPU请求转化为一系列符合内存颗粒标准的命令(如DDR标准),发送给内存接口;
步骤1008,判断该CPU请求是否为复杂访存请求,如果是则进入步骤1009,如果不是则进入步骤1011;
步骤1009,如果该CPU请求为复杂访存请求,缓冲调度器内的处理逻辑对从内存返回的数据进行简单的处理(如简单算术逻辑运算、移动等);
步骤1010,复杂访存指令被处理之后,根据请求的类别,选择是否需要将处理后的数据写回内存,是否需要将处理后的数据返回给CPU,如果需要写回内存,则通过一系列符合内存颗粒标准的命令(如DDR标准)写入内存,如果需要返回给CPU,则将数据封装为响应包,发送给消息式内存控制器;
步骤1011,如果该CPU请求不是复杂访存请求,则判断是否为写请求,如果是则进入步骤1015,如果不是则进入步骤1012;
步骤1012,如果该CPU请求是读请求,则将读回的数据封装为响应包,通过消息通道发送给消息式内存控制器,封装响应包时,可根据需求将一个请求返回的数据拆分封装为多个响应包,也可多个请求返回的数据合并封装为一个响应包;
步骤1013,消息式内存控制器接收到响应包,进行解析,根据需要将响应包中的数据存储在cache或消息式内存控制器的内部可寻址缓冲区内;
步骤1014,消息式内存控制器判断该CPU请求的响应包是否全部返回,如果全部返回则进入步骤1015,如果不是则进入步骤1013;
步骤1015,该CPU请求完成,如果其在消息式内存控制器读写请求保留站内有记录,则消除该记录。
如图11所示,访存请求被消息式内存控制器接收的处理流程是:
步骤1101,消息式内存控制器从访存请求端口接收CPU发送的读写请求;
步骤1102,读写请求分配器701判断请求是否是读请求。如果是读请求,跳转到步骤1104;否则,跳转到步骤1103;
步骤1103,如果收到的请求是写请求,判断写请求状态表是否存在空项。如果写请求状态表存在空项,则跳转到步骤1105;否则,跳转到步骤1102;
步骤1104,如果收到的请求是读请求,判断读请求状态表是否存在空项。如果读请求状态表存在空项,则跳转到步骤1106;否则,跳转到步骤1102;
步骤1105,如果收到的请求是写请求,而且写请求状态表存在空闲的表项,则为该请求分配一个表项,并将写请求中的数据存入到写数据缓冲区;否则,跳转到步骤1102;
步骤1106,如果收到的请求是读请求,而且读请求状态表存在空闲的表项,则为该请求分配一个表项;否则,跳转到步骤1102;
步骤1107,结束本次请求的接收,并继续处理从访存请求接口接收到的请求。
如图12所示,消息式内存控制器调度并处理请求包括以下步骤:
步骤1201,请求生成与调度器705扫描读写请求状态表的表项;
步骤1202,请求生成与调度器705查询读写请求状态表中是否有未完成而需要被处理的请求。如果有未完成的表项,跳转到步骤1203;否则,跳转到步骤1201;
步骤1203,如果存在未完成的请求,请求生成与调度器根据请求在对应请求状态表中的属性,将一个大的请求划分成多个小的请求,并根据调度算法选择下一时刻被选择处理的请求;
步骤1204,判断待处理的请求是否是读请求。如果是读请求,跳转到步骤1206;否则,跳转到步骤1205;
步骤1205,如果待处理的请求是写请求,需要从写数据缓冲区中获取该请求对应的数据;否则,直接跳到步骤1206;
步骤1206,消息打包器706将一个或多个请求封装是消息包的格式;
步骤1207,将打包后的消息发送给消息式内存控制器与缓冲调度器的消息通道接口;并转入到步骤1201继续下一轮的处理。
如图13所示,消息式内存控制器接收到缓冲调度器发送的消息包后的步骤是:
步骤1302,解析从缓冲调度器发送到消息式内存控制器的响应包的包头信息,获取包头内响应的个数以及每个响应长度,用于下面逐个解析响应;
步骤1304,判断是否还有下一个响应需要解析,如果有,则进入步骤1306解析下一个响应;否则本次解析响应包结束;
步骤1306,解析下一个响应的类型和请求标识,下面需要根据不同的响应类型分别进行不同的处理;
步骤1308,判断是否为访存读请求响应,如果是,则进入步骤1310进一步解析;否则得到的是存储器状态查询请求响应或访存写请求响应,进入步骤1312获取对应状态信息;
步骤1310,根据包头指示的该响应长度,寻址到响应,并从访存读请求响应中获取返回的数据;
步骤1312,根据包头指示的响应长度寻址到响应,如果是状态查询请求响应,则从中获取返回的状态值;如果是访存写请求响应,则更新写请求状态表中该请求的属性,至此解析本响应结束,回到步骤1304;
步骤1314,根据包内是否含有子响应判断返回的访存读请求数据是否被缓冲调度器拆分成多个响应返回。如果没有被拆分成多个子响应,则完成本次访存读请求,进入步骤1318;如果被拆分,则解析获取子响应的个数和当前子响应的标识,进入步骤1316;
步骤1316,判断本次响应是否为访存读请求的最后一个子响应,判断的依据是本次子响应标识是否等于子响应个数。如果是,那么完成本访存读请求,进入步骤1318;否则访存读请求还未完成,将本次返回的子响应数据写入到对应的数据缓冲中,并更新该请求在读请求状态表中的数据状态和数据位置等信息,回到步骤1304;
步骤1318,完成本访存读请求,之后就可以准备将数据从消息式内存控制器传回到CPU,回到步骤1304。
如图14所示,消息式内存控制器向CPU响应请求的步骤是:步骤1401,请求响应控制器709扫描读写请求状态表;
步骤1402,查询写请求状态表中是否有已完成的请求。如果有,跳转到步骤1404;否则,跳转到步骤1403;
步骤1403,如果写请求状态表中没有已完成的请求项,则查询读请求状态表中是否有已完成的请求项。如果有,跳转到步骤1404;否则,跳转到步骤1402;
步骤1404,如果写请求状态表或读请求状态表中有已完成的请求,则判断已完成的请求是否满足请求属性的要求,如定时时延等属性。如果满足,跳转到步骤1405;否则,跳转到步骤1402;
步骤1405,向CPU发送满足所有属性的请求的响应,响应的数据内容也需要与请求的返回粒度等属性匹配。
如图15所示,请求调度器908调度访存请求的步骤是:步骤1510,定时器906根据设置好的条件,触发请求调度器908,准备开始一次新的请求调度;
步骤1520,检查此次触发条件是否为芯片状态维护请求,若是执行步骤1530,否则执行步骤1540;
步骤1530,本次定时器触发的条件是需要进行芯片状态维护,发出芯片状态维护命令,转到步骤1590;
步骤1540,检查此次触发条件是否要求处理特殊请求队列,若是执行步骤1550,否则执行步骤1560;
步骤1550,本次定时器触发的条件是需要处理特殊请求队列,读入特殊请求队列中的请求,转化成一序列的读写操作。修改队列中的请求状态或是在请求完成后移除。转到步骤1590;
步骤1560,检查此次触发条件是否要求处理优先级最高的读写请求队列,若是执行步骤1570,否则执行步骤1580;
步骤1570,本次定时器触发的条件是需要处理优先级最高的读写请求队列,移除队列中的所有请求,并对所有的读请求标上合并标记。转到步骤1590;
步骤1580,本次定时器触发的条件是需要处理非最高优先级的读写请求队列,访问对应优先级请求队列中的请求,根据读写请求当前的状态生成需要的读写操作。修改队列中的请求状态或是在请求完成后移除。转到步骤1590;
步骤1590,本次请求调度结束,等待下一次定时器触发。
以上所述仅为本发明技术构思下的一些基本说明,而依据本发明的技术方案即所做的任何等效变换,均应属于本发明的保护范围,例如针对非易失存储器的新型内存技术等均是保护对象。
本领域的技术人员在不脱离权利要求书确定的本发明的精神和范围的条件下,还可以对以上内容进行各种各样的修改。因此本发明的范围并不仅限于以上的说明,而是由权利要求书的范围来确定的。