发明内容
本发明的目的在于提供一种高密度多处理器系统及其节点控制器。其实现了多个处理器的高速互连,提高多处理器系统的密度,并实现多个处理器对商品化外设的共享访问。
为实现本发明的目的而提供的一种高密度多处理器系统的节点控制器,包括:多个处理器端口,一个I/O端口,一个直接内存访问交叉开关模块和一个读/写交叉开关模块,其中:
所述处理器端口,分为主处理器端口和从处理器端口,用于分别与主处理器和从处理器连接,主处理器负责具体计算任务的运行,以及对外围设备的发现和初始化过程,从处理器只负责具体计算任务的运行;
所述I/O端口,通过I/O总线与外围设备连接,其包括:读/写模块和I/O接口模块,所述I/O接口模块用于负责实现I/O总线根设备逻辑,所述I/O接口模块通过一窗口寄存器记录该端口的全局地址分配,并实现系统总线包格式与I/O总线包格式间的互相转换;所述读/写模块与所述读/写交叉开关模块连接;
所述直接内存访问交叉开关模块,用于实现各所述处理器端口间直接内存访问数据的交换;
所述读/写交叉开关模块,用于实现各所述处理器端口之间,以及所述处理器端口和I/O端口之间读/写数据的交换。
所述处理器端口,包括:处理器接口模块、分发模块、仲裁模块、直接内存访问模块、读/写模块和I/O高级可编程中断控制器模块其中:
所述处理器接口模块,根据其所属的处理器端口连接的处理器的类型的不同,分为主处理器接口模块和从处理器接口模块,其中:所述主处理器接口模块,负责与主处理器系统总线的挂接,包括所有总线链路层功能,主处理器接口模块通过一窗口寄存器记录该端口的全局地址分配,并实现系统总线终端设备的配置空间和桥设备的配置空间;所述从处理器接口模块,负责与从处理器系统总线的挂接,包括所有总线链路层功能,从处理器接口模块通过一窗口寄存器记录该端口的全局地址分配,并实现系统总线终端设备的配置空间;
所述分发模块,用于将来自所述处理器接口模块的数据按照所属功能分发给直接内存访问模块或读/写模块,或I/O高级中断控制器模块;
所述仲裁模块,用于将来自直接内存访问模块、读/写模块和I/O高级中断控制器模块的数据进行公平仲裁后,分时传递给所述处理器接口模块,实现多种数据在处理器接口总线上的共享传输;
所述直接内存访问模块,用于实现数据以直接内存访问方式在处理器间的传输,所述直接内存访问模块与所述直接内存访问交叉开关模块连接;
所述读/写模块,用于实现数据以读/写方式在处理器间的传输,所述读/写模块与所述读/写交叉开关模块连接;
所述I/O高级中断控制器模块,用于实现对应所述处理器端口的I/O高级中断控制器中断控制。
所述分发模块中对数据所属功能的区分通过两个途径,一方面通过设备配置空间的基址寄存器地址窗口,另一方面为不同功能模块向系统总线申请不同的设备号,然后根据数据所属设备号实现功能区分。
所述直接内存访问模块包括下传和上传两个子模块,其中下传子模块负责接收直接内存访问描述符,读取直接内存访问负载数据,并将数据发送至所述直接内存访问交叉开关模块;上传子模块负责从所述直接内存访问交叉开关模块接收直接内存访问数据,并将数据写入目标地址区域。
所述读/写模块包括下传和上传两个子模块,其中下传子模块负责从所述分发模块接收读/写请求以及读响应数据,并发送至所述读/写交叉开关模块;上传模块负责从所述读/写交叉开关模块接收数据并发送至目的地址。
所述直接内存访问交叉开关模块为每个所述处理器端口设置两个虚通道缓冲区,一个发送缓冲区,核心使用一个2N×N的交叉开关,N为交叉开关互连的处理器端口数目;数据对虚通道缓冲区的选择符合如下规则:目标处理器端口号为奇数的进入1号接收虚通道缓冲区,目标处理器端口号为偶数的进入0号接收虚通道缓冲区。
所述读/写交叉开关模块为每个处理器及I/O端口设置两个虚通道缓冲区,一个发送缓冲区,核心使用一个2(N+1)×(N+1)的交叉开关,N为交叉开关互连的处理器端口数目;数据对虚通道缓冲区的选择符合如下规则:目标处理器端口号为奇数的进入1号接收虚通道缓冲区,目标处理器端口号为偶数的进入0号接收虚通道缓冲区。
为实现本发明的目的还提供一种所述节点控制器实现读数据传输的方法,所述方法,包括下列步骤:
步骤110.源处理器端口的处理器接口模块接收源处理器发出Load指令,传递给源处理器端口的分发模块,该分发模块通过查询基址寄存器判定该指令为读指令后,将该读指令发送给源处理器端口的读/写模块;
步骤120.所述读/写模块获取Load指令中的全局地址,然后查询节点控制器内各端口的窗口寄存器,若没有在任何一个窗口寄存器中命中,则发送响应包至源处理器或I/O端口,同时响应包中的状态域的错误位置位为1;若全局地址在窗口表中命中,则根据窗口号生成目的端口号,并使用目的端口号替换Load请求中全局地址的高
位,使用源窗口号替换Load请求中的携带的设备号,将Load请求发送至读/写交叉开关模块;
步骤130.所述读/写交叉开关模块以读请求的目的端口号作为路由信息,将读请求转发至目的处理器端口或目的I/O端口;
步骤140.所述目的处理器端口或目的I/O端口的读/写模块为该读请求生成目的总线请求序号目的Tag,并以该目的Tag为地址,将读请求携带的源Tag和源端口号存储;
步骤150.所述目的处理器端口或目的I/O端口的读/写模块使用目的Tag替换读请求的源Tag后,经过目的处理器接口模块或目的I/O接口模块,最终将读请求发送至目的处理器或目的I/O端口相连的I/O设备;
步骤160.所述目的处理器或I/O端口相连的I/O设备返回响应包;
步骤170.所述目的处理器端口或目的I/O端口的读/写模块使用响应包中的Tag读取之前存储的源Tag和源端口号,并使用该源Tag替换响应包的Tag,使用该源端口号替换响应包的设备号,发送至读/写交叉开关模块;
步骤180.源处理器端口的读/写模块接收到读/写交叉开关模块转发的响应包后,清除响应包的目的端口号,发送至源处理器或I/O端口,完成整个读数据过程。
为实现本发明的目的还提供一种所述节点控制器实现写数据传输的方法,所述方法,包括下列步骤:
步骤210.源处理器端口的处理器接口模块接收源处理器发出的写指令,传递给源处理器端口的分发模块,该分发模块通过查询基址寄存器判定该指令为写指令后,将该写指令发送给源处理器端口的读/写模块;
步骤220.所述源处理器端口的读/写模块获取写指令中的全局地址,然后查询节点控制器内各端口的窗口寄存器,若没有在任何一个窗口寄存器中命中,则发送响应包至源处理器端口或I/O端口,同时响应包中的状态域的错误位置位为1;若全局地址在窗口表中命中,则根据窗口号生成目的端口号,并使用目的端口号替换写请求中全局地址的高位,使用源窗口号替换写请求中的设备号,将写请求发送至读/写交叉开关;
步骤230.读/写交叉开关模块根据写请求的目的端口号,将写请求转发至目的处理器或目的I/O端口;
步骤240.所述目的处理器或I/O端口的读/写模块清除写请求中的地址高位,并将修改后的写请求经过目的处理器接口模块或目的I/O接口模块,最终发送至目的处理器或I/O端口相连的I/O设备,完成整个写数据过程。
为实现本发明的目的还提供一种所述节点控制器实现直接内存访问数据传输的方法,所述方法,包括下列步骤:
步骤310.源处理器端口的直接内存访问模块接收直接内存访问描述符,并将该描述符转换为一系列读请求的过程;
步骤320.所述源处理器端口的直接内存访问模块接收一系列读请求返回的响应包,并将响应包转换为一系列写请求的过程;
步骤330.一系列写请求被直接内存访问交叉开关转发至目的处理器端口的直接内存访问模块,并写入目的处理器内存的过程。
所述步骤310,包括下列步骤:
步骤311.上电复位后,直接内存访问模块将用于记录当前直接内存访问序号的直接内存访问序号计数器DMASeq复位置0,然后等待接收直接内存访问描述符;
步骤312.接收到直接内存访问描述符后,便根据直接内存访问目的起始地址查询各个处理器端口的窗口寄存器,若未命中任何窗口寄存器,则直接发送错误通知到源处理器;若命中窗口,则初始化三个计数器,分别是长度计数器LengthCnt,使用DMALen作为初值,源地址计数器SrcAddrCnt,使用SrcAddr作为初值和目的地址计数器DstAddrCnt,使用DstAddr作为初值;
步骤313.构造一个读请求,产生读请求所需的请求序号srctag,以SrcAddrCnt填充读请求所需的地址,以包长len填充读请求所需的长度,然后将该读请求发送至源处理器;
步骤314.以所述读请求所需的请求序号为地址,将DstAddrCnt,DMALen和DMASeq存入目标地址RAM中;
步骤315.置DstAddrCnt=DstAddrCnt+len;SrcAddrCnt=SrcAddrCnt+len;LengthCnt=LengthCnt-len。
步骤316.如果LengthCnt大于0,则跳转至步骤313;否则DMASeq加一,跳转至步骤312。
所述步骤320,包括下列步骤:
步骤321.源处理器端口的直接内存访问模块接收来自源处理器系统总线的读响应包;
步骤322.以响应包中的序号srctag为地址,读取所述目标地址RAM,获取其对应的直接内存访问序号DMASeq,直接内存访问目的地址DstAddr_i和直接内存访问总长度DMALen;
步骤323.以DMASeq为索引,获取接收计数器堆中的接收计数器RecvLengthCnt;
步骤324.构造一个写请求,该请求的地址域高
位由DstAddr_i对应的窗口号填充,地址其他位由DstAddr_i的相应位填充;该请求携带的数据负载为读响应包携带的数据负载;该请求携带的长度域由读响应包携带的长度域len填充,将该写请求发送至直接内存访问交叉开关模块;
步骤325.置RecvLengthCnt=RecvLengthCnt+len,并回写至DMASeq对应的接收计数器堆中;
步骤326.若RecvLengthCnt==DMALen,则跳转至步骤327;否则,跳转至步骤321;
步骤327.构造一个写请求,该请求的含义是通知目的处理器的直接内存访问模块,当前直接内存访问请求完成;该请求的地址域只填充高
位,由DstAddr_i对应的窗口号填充;该请求携带的长度域置为1;该请求携带的数据域为空;该请求的设备号被填充为最大窗口号加一,将该写请求发送至直接内存访问交叉开关。
所述步骤330,包括下列步骤:
步骤331.直接内存访问交叉开关模块根据其地址高位携带的目的窗口号,转发至目的处理器端口的直接内存访问模块;
步骤332.目的处理器端口的直接内存访问模块将写请求的高
位清除;
步骤333.若写请求的设备号为最大窗口号加一,则该请求为直接内存访问完成事件包,跳转至步骤334;否则跳转至步骤335;
步骤334.获取目的端口提供的完成事件队列地址,将该地址填入到写请求的地址域;
步骤335.将写请求发送至目的处理器。
为实现本发明的目的还提供一种所述节点控制器的高密度多处理器系统,所述系统,包括:多个节点,其中:
所述节点,包括:多个处理器和一个所述节点控制器。
所述节点控制器,通过支持全局地址空间来实现节点内资源的共享,其包括全局地址空间专用寄存器,其中:
所述全局地址空间专用寄存器设置在每个处理器端口中,节点控制器使用静态分配的方式隔离各个端口的地址空间,每个地址窗口最大为:
其中MAXBIT是系统地址位宽。
本发明的有益效果是:
1.实现多个处理器间松散耦合互连,相比于传统的SMP或ccNUMA系统,不仅增强了节点的可扩展性,提高节点密度,而且单一从处理器的故障不会导致系统停顿,提高了系统可靠性;
2.支持全局统一地址空间,对节点内的内存和I/O设备进行统一编址,内存和I/O设备都对应一系列的全局地址,节点内每个处理器都可以通过使用携带全局地址的Load/Store指令实现对节点内存和I/O设备的访问,即实现节点内处理器对节点内存和I/O设备的共享;
3.控制器为每个处理器端口设置DMA引擎,实现处理器间高效的数据传输,且DMA引擎的设计可以容忍系统总线的乱序响应特性;
4.通过在控制器内部分别为Load/Store和DMA设置两个交叉开关,减少大块数据和短数据传输的互扰,提高通信效率;
5.控制器内部的交叉开关采用双虚通道设计,数据对虚通道的使用,与目的端口号的奇偶进行绑定,实现了同源同目的数据的保序,并大大降低队头阻塞,提高了传输效率;
6.控制器对外接口采用标准工业总线,且内部实现完整的PCI拓扑,为使用商用设备提供保证;
7.由于系统的外设发现配置由主处理器完成,因此只要保证主处理器是主流处理器,就可以最大程度兼容商用设备。即使从处理器是新型处理器,也可以实现从处理器对外设的访问,进而降低了系统升级成本,并在一定程度上兼容异构处理器。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明的一种高密度多处理器系统及其节点控制器进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明的一种高密度多处理器系统及其节点控制器,实现了多个处理器的高速互连,提高多处理器系统的密度,并实现多个处理器对商品化外设的共享访问。
下面结合上述目的详细说明的本发明的节点控制器,图1是本发明的节点控制器的内部结构示意图,如图1所示,所述节点控制器,包括:
多个处理器端口1,分别与多个处理器连接。
处理器端口在逻辑功能上分为两类,一类称为主处理器端口,主处理器除负责具体计算任务的运行外,更重要的是负责对外围设备的发现和初始化过程,该类端口在节点控制器中只有一个;一类称为从处理器端口,从处理器只负责具体计算任务的运行,该类端口在节点控制器中可以有多个。
所述处理器端口1,包括:
处理器接口模块11,分为主处理器接口模块111和从处理器接口模块112;
所述主处理器接口模块111,负责与主处理器系统总线的挂接,包括所有总线链路层功能,通过一窗口寄存器记录该端口的全局地址分配,并实现系统总线终端(Endpoint)设备的配置空间和桥(Bridge)设备的配置空间。如使用AMD处理器,则主处理器接口模块为Hyper Transport控制器,该端口在AMD处理器看来是一个HT终端设备和一个HT桥接设备。
所述从处理器接口模块112,负责与从处理器系统总线的挂接,包括所有总线链路层功能,通过一窗口寄存器记录该端口的全局地址分配,并实现系统总线终端(Endpoint)设备的配置空间。如使用AMD处理器,则主处理器接口模块为Hyper Transport控制器,该端口在AMD处理器看来是一个HT终端设备。
分发模块12,负责将来自处理器接口模块的数据按照所属功能分发给相应的处理模块,如与直接内存访问相关的数据分发至直接内存访问模块,与读/写相关的数据分发至读/写模块,与中断相关的数据分发给IOAPIC模块。数据所属功能的区分通过两个途径,一方面通过设备配置空间的基址寄存器(Base Address Register,BAR)地址窗口,另一方面为不同功能模块向系统总线申请不同的设备号(Unit ID),然后根据数据所属设备号(Unit ID)实现功能区分;
仲裁模块13,负责将来自各处理模块(即直接内存访问模块、读/写模块和I/O高级中断控制器模块)的数据(如直接内存访问数据,中断数据,读/写数据等)仲裁传递给处理器接口模块,实现多种数据在处理器接口总线上的共享传输;
DMA模块14,每个处理器端口均包含该模块,它负责实现数据以直接内存访问(DMA)方式在处理器间的传输,DMA引擎包括下传和上传两个子模块。其中下传子模块负责接收DMA描述符,读取DMA负载数据,并将数据发送至DMA交叉开关模块;上传子模块负责从DMA交叉开关模块接收DMA数据,并将数据写入目标地址区域。
Load/Store模块15,每个处理器端口都包含该模块,它负责实现数据以Load/Store方式在处理器间的传输,Load/Store模块包括下传和上传两个子模块。其中下传子模块负责从分发模块接收Load/Store请求以及Load响应数据,并发送至Load/Store交叉开关;上传模块负责从Load/Store交叉开关接收数据,并发送至目的地址。该模块实现所属节点内的内存及设备资源的共享。
I/O高级可编程中断控制器(I/O Advanced Programmable Interrupt Controller,IOAPIC)模块16,每个处理器端口均包含该模块,它负责实现对应端口的IOAPIC中断控制。
一个I/O端口2,是I/O总线的根设备,例如I/O总线为PCI-Express时,该I/O端口就是PCI-Express Root Complex。
所述I/O端口2包括Load/Store模块22和I/O接口模块21。其中I/O端口中的Load/Store模块与处理器端口中的Load/Store模块功能结构相同;I/O接口模块负责实现I/O总线根设备逻辑,通过一窗口寄存器记录该端口的全局地址分配,并实现系统总线包格式与I/O总线包格式间的互相转换。例如,使用PCI-Express总线,则该模块实现PCI-Express Root Complex的物理层、链路层和事务层协议,如果选择HT作为系统总线,则该模块实现HT到PCI-Express之间的包格式转换。
图2A是本发明的节点控制器内部交叉开关结构框图,如图2A所示,所述直接内存访问(Direct Memory Access,DMA)交叉开关模块3,负责实现各处理器端口间DMA数据的交换,交叉开关结构为端口间互连提供了较好的扩展性。DMA交叉开关模块为每个处理器端口设置两个虚通道缓冲区,一个发送缓冲区,核心使用一个2N×N的交叉开关(N为交叉开关互连的处理器端口数目)。数据对虚通道缓冲区的选择符合如下规则:目标处理器端口号为奇数的进入1号接收虚通道缓冲区,目标处理器端口号为偶数的进入0号接收虚通道缓冲区。这样的优势是一方面可以实现同源同目的DMA数据间保序,另一方面减少队头阻塞,提高交叉开关的数据注入率。
图2B是本发明的节点控制器内部交叉开关结构框图,如图2B所示,所述读/写(Load/Store)交叉开关模块4,负责实现各处理器端口间,以及处理器端口和I/O端口间Load/Store数据的交换,交叉开关结构为端口间互连提供了较好的扩展性。Load/Store交叉开关模块为每个处理器及I/O端口设置两个虚通道接收虚通道缓冲区,一个发送缓冲区,核心使用一个2(N+1)×(N+1)的交叉开关(N为交叉开关互连的处理器端口数目)。数据对虚通道缓冲区的选择符合如下规则:目标处理器端口号为奇数的进入1号接收虚通道缓冲区,目标处理器端口号为偶数的进入0号接收虚通道缓冲区。这样的优势是一方面可以实现同源同目的Load/Store操作间保序,另一方面减少队头阻塞,提高交叉开关的数据注入率。
较佳地,由于对于Load/Store数据的交换,数据长度短,因此Load/Store交叉开关的接收发送缓冲区较小,而直接内存访问数据长度较长,因此DMA交叉开关的接收发送缓冲区较大,将Load/Store数据和直接内存访问数据分开进行交换,可以很好的避免长数据造成的队头阻塞,减少两类数据的互相干扰。
相应于本发明的一种高密度多处理器系统的节点控制器,还提供所述节点控制器实现读/写(Load/Store)数据传输的方法。
本发明的节点控制器对所属节点内的内存和I/O设备进行统一编址,内存和I/O设备都对应一系列的全局地址,节点内每个处理器都可以通过使用携带全局地址的Load/Store指令实现对节点内存和I/O设备的访问,即Load/Store操作实现了节点内处理器对节点内存和I/O设备的共享。Load是指源处理器端口或源I/O端口,从目的处理器的内存或I/O设备中读取数据的过程。图3是本发明的节点控制器实现Load操作的步骤流程图,如图3所示:
1.源处理器发出Load指令,该指令首先被源处理器端口的处理器接口模块接收,传递给源处理器端口的分发模块,然后该分发模块通过查询BAR判定该指令为Load指令,然后将该Load指令发送给源处理器端口的Load/Store模块;
所述Load指令,包括发起Load请求的设备号、请求序号、读取数据长度及数据所在全局地址,具体格式为:
设备号UnitID |
请求序号Tag |
长度 |
全局地址 |
2.Load/Store模块获取Load指令中的全局地址,然后查询节点控制器内各端口的窗口寄存器(存在于处理器和I/O接口模块中),若没有在任何一个窗口寄存器中命中,则发送响应包至源处理器或I/O端口,同时响应包中的状态域的错误位置位为1。若全局地址在窗口表中命中,则根据窗口号生成目的端口号,并使用目的端口号替换Load请求中全局地址的高
位,使用源窗口号替换Load请求中的携带的设备号(Unit ID:系统总线中用以区分不同设备的ID号,Load请求中携带该ID,用以标识该Load请求的来源),将Load请求发送至Load/Store交叉开关模块;其中,窗口号i到端口号j的映射关系为:
3.Load/Store交叉开关模块以Load请求的目的端口号作为路由信息,将Load请求转发至目的处理器端口或目的I/O端口;
4.目的处理器端口或目的I/O端口的Load/Store模块为该Load请求生成目的总线请求序号目的Tag,并以该目的Tag为地址,将Load请求携带的源Tag和源端口号存储;
其中,步骤3是为了描述数据在控制器内部被交换的过程,步骤4是一个保护现场的过程,由于Load请求会被发送到目的总线,从源总线携带来的Tag就不能使用了,而要使用目的总线的Tag,Tag的管理是与单条总线绑定的。
5.目的处理器端口或目的I/O端口的Load/Store模块使用目的Tag替换Load请求的源Tag后,经过目的处理器接口模块或目的I/O接口模块,最终将Load请求发送至目的处理器或目的I/O端口相连的I/O设备;
6.目的处理器或I/O端口相连的I/O设备返回响应包,包括对应Load请求的设备号和请求序号,返回的数据状态及返回的数据负载,所述响应包的格式为:
设备号UnitID |
请求序号Tag |
数据状态 |
数据负载 |
7.目的处理器端口或目的I/O端口的Load/Store模块使用响应包中的Tag读取之前存储的源Tag和源端口号,并使用该源Tag替换响应包的Tag,使用该源端口号替换响应包的设备号(作为响应包的目的端口号),发送至Load/Store交叉开关模块;
8.源处理器端口的Load/Store模块接收到Load/Store交叉开关模块转发的响应包后,只需清除响应包的目的端口号(响应包的设备号),即可发送至源处理器或I/O端口,完成整个Load流程。
Store,是指源处理器端口或源I/O端口,向目的处理器的内存或I/O设备写入数据的过程。图4是本发明的节点控制器实现Store操作的步骤流程图,如图4所示:
1.源处理器发出Store指令,该指令首先被源处理器端口的处理器接口模块接收,传递给源处理器端口的分发模块,然后该分发模块通过查询BAR(基址寄存器)判定该指令为Store指令,然后将该Store指令发送给源处理器端口的Load/Store模块;
所述Store指令,包括发起Store请求的设备号、请求序号、写入数据长度及存储数据的全局地址,所述Store指令的格式为:
设备号UnitID |
请求序号Tag |
长度 |
全局地址 |
2.源处理器端口的Load/Store模块获取Store指令中的全局地址,然后查询节点控制器内各端口的窗口寄存器(存在于处理器和I/O接口模块中),若没有在任何一个窗口寄存器中命中,则发送响应包至源处理器端口或I/O端口,同时响应包中的状态域的错误位置位为1。若全局地址在窗口表中命中,则根据窗口号生成目的端口号,并使用目的端口号替换Store请求中全局地址的高
位,使用源窗口号替换Store请求中的设备号,将Store请求发送至Load/Store交叉开关。
3.Load/Store交叉开关模块根据Store请求的目的端口号,将Store请求转发至目的处理器或目的I/O端口。
4.目的处理器或I/O端口的Load/Store模块清除Store请求中的地址高
位,并将修改后的Store请求,经过目的处理器接口模块或目的I/O接口模块,最终发送至目的处理器或I/O端口相连的I/O设备,完成整个Store过程。
相应于本发明的一种高密度多处理器系统的节点控制器,还提供所述节点控制器实现直接内存访问(DMA)数据传输的方法。
本发明的DMA数据传输过程是处理器间的直接内存访问(DMA)过程,具体说是一个处理器将大块本地数据直接传输到另一个处理器内存中的过程。该过程在源处理器端是一系列的Load请求,在目的处理器端是一系列的Store请求。DMA描述符包括三个域,分别是源数据所在起始地址SrcAddr,所要传输的数据长度DMALen,以及数据所要写入的目的起始地址DstAddr,其中SrcAddr为本地地址,DstAddr为全局地址。源处理器必须使用单一的Store请求将DMA描述符写入DMA模块中,以保证DMA操作的原子性。所述DMA描述符的具体结构为:
DMA的操作流程分为三个阶段,第一个阶段是源处理器端口的DMA模块接收DMA描述符,并将该描述符转换为一系列Load请求的过程;第二个阶段是源处理器端口的DMA模块接收一系列Load请求返回的响应包,并将响应包转换为一系列Store请求的过程;第三个阶段是一系列Store包被DMA交叉开关转发至目的处理器端口的DMA模块,并写入目的处理器内存的过程。这三个阶段构成DMA操作的三个流水级(Pipeline Stage),并行流水执行。本发明所述的DMA流程可以容忍第一阶段中多个Load请求被乱序响应的情况(如HT总线会乱序响应Load请求)。
图5是本发明中DMA操作第一个阶段的执行步骤流程图,如图5所示,其过程为:
1.上电复位后,DMA模块将用于记录当前DMA序号的DMA序号计数器DMASeq复位置0,然后等待接收DMA描述符;
2.接收到DMA描述符后,便根据DMA目的起始地址DstAddr查询各个处理器端口的窗口寄存器。若未命中任何窗口寄存器,则直接发送错误通知到源处理器;若命中窗口,则初始化三个计数器,分别是长度计数器LengthCnt,使用DMALen作为初值;源地址计数器SrcAddrCnt,使用SrcAddr作为初值;目的地址计数器DstAddrCnt,使用DstAddr作为初值;
3.构造一个Load请求,首先产生Load请求所需的请求序号srctag,以SrcAddrCnt填充Load请求所需的地址,以包长len填充Load请求所需的长度,然后将该Load请求发送至源处理器;
4.以srctag为地址,将DstAddrCnt,DMALen和DMASeq存入目标地址RAM中,目标地址RAM的结构为:
5.置DstAddrCnt=DstAddrCnt+len;SrcAddrCnt=SrcAddrCnt+len;LengthCnt=LengthCnt-len。
6.如果LengthCnt大于0,则跳转至步骤3;否则DMASeq加一,跳转至步骤2。
图6是本发明中DMA操作第二阶段的执行步骤流程图,如图6所示,其过程为:
1.源处理器端口的DMA模块接收来自源处理器系统总线的Load响应包。
2.以响应包中的序号srctag为地址,读取目标地址RAM,获取其对应的DMA序号DMASeq,DMA目的地址DstAddr_i和DMA总长度DMALen。
3.以DMASeq为索引,获取接收计数器堆中的接收计数器RecvLengthCnt,接收机数据器堆的格式为:
4.构造一个Store请求,该请求的地址域高
位由DstAddr_i对应的窗口号填充,地址其他位由DstAddr_i的相应位填充;该请求携带的数据负载为Load响应包携带的数据负载;该请求携带的长度域由Load响应包携带的长度域len填充,将该Store请求发送至DMA交叉开关模块;
5.置RecvLengthCnt=RecvLengthCnt+len,并回写至DMASeq对应的接收计数器堆中。
6.若RecvLengthCnt=DMALen,则跳转至步骤7;否则,跳转至步骤1。
7.构造一个Store请求,该请求的含义是通知目的处理器的DMA模块,当前DMA请求完成。该请求的地址域只填充高
位,由DstAddr_i对应的窗口号填充;该请求携带的长度域置为1;该请求携带的数据域为空;该请求的设备号被填充为最大窗口号加一,将该Store请求发送至DMA交叉开关。
图7是本发明中DMA操作第三阶段的执行步骤流程图,如图7所示,其过程为:
1.DMA交叉开关模块根据其地址高位携带的目的窗口号,转发至目的处理器端口的DMA模块;
2.目的处理器端口的DMA模块将Store请求的高位清除;
3.若Store请求的设备号为最大窗口号加一,则该请求为DMA完成事件包,跳转至步骤4;否则跳转至步骤5。
4.获取目的端口提供的完成事件队列地址,将该地址填入到Store请求的地址域。
5.将Store请求发送至目的处理器。
在本发明中,只对于纯粹的数据传输的两种类型的传输方法进行了描述,但用于控制目的的还有中断相关数据,中断相关数据的产生属于标准流程,所以本发明没有进行详细的描述。
相应于本发明的一种高密度多处理器系统的节点控制器,还提供一种高密度多处理器系统,所述系统包括多个节点,每个节点包括多台处理器和一个节点控制器,所述节点控制器的结构和数据传输方法在上面已经说明,在此不再一一赘述。
本发明所述节点控制器所在的节点中,所有处理器均为主设备,均会独立发起对节点控制器的设备发现过程。由于主处理器负责所有节点外设的配置,因此主处理器与从处理器的设备发现过程不同。
从处理器的设备发现及配置过程:
1.BIOS启动后,便探查从处理器端口的系统总线终端设备,读取其配置空间,配置BAR寄存器。
2.从处理器端口的系统总线终端设备返回设备搜索、及功能搜索完成通知,完成BIOS的设备发现过程。
3.BIOS读取从处理器端口的端口号i。
4.根据从处理器本地内存的大小配置窗口i+1的GAS_START和GAS_END寄存器,完成整个从处理器对节点控制器的配置过程。
主处理器的设备发现及配置过程:
1.BIOS启动后,便探查主处理器端口的系统总线终端设备(主处理器系统总线0的设备0),读取其配置空间,配置BAR寄存器。
2.探查主处理器端口的系统总线桥设备(主处理器系统总线0的设备1),读取其配置空间。
3.通过系统总线桥设备继续向下搜索,发现节点控制器I/O端口内的I/O总线根设备(Root Complex)。
4.最后通过I/O总线根设备进行标准PCI设备发现过程,配置各级设备的BAR寄存器,完成整个设备发现过程。
5.完成设备发现后,BIOS根据主处理器本地内存大小,配置窗口0的MEM_START和MEM_END寄存器,配置窗口1的GAS_START和GAS_END寄存器值得注意的是,窗口1的GAS_START和GAS_END相对于窗口1上边界的偏移分别等于MEM_START和MEM_END。
根据外设申请空间的大小,配置窗口0的DEV_START和DEV_END寄存器和窗口(N+2)的GAS_START和GAS_END寄存器,值得注意的是,窗口(N+2)的GAS_START和GAS_END相对于窗口N+2上边界的偏移分别等于DEV_START和DEV_END。
图8是本发明的高密度多处理器系统的结构示意图,如图8所示,该节点包含N个处理器单元,包括唯一的主处理器和N-1个从处理器,但从处理器不局限于单个处理器,也可以是使用SMP/NUMA结构互连的多个处理器,节点控制器使用处理器的系统总线(如AMD处理器的HT总线,Intel的QPI总线)与各类处理器相连。该节点包含若干外围设备,外围设备通过I/O总线(如PCI-Express总线)与节点控制器相连。这里所述的从处理器并不等同于一般意义上的协处理器概念,从处理器的计算任务并不依靠主处理器分配,而是可以独立部署,因此从处理器和主处理器逻辑功能上的差别只存在于设备发现上,在具体任务执行和资源共享方面并无管理者与被管理者关系。
本发明的节点控制器在处理器的角度看来是设备,图9是本发明的节点控制器所在节点的总线拓扑图,如图9所示,在从处理器的角度,节点控制器是系统总线的终端设备(Endpoint),该设备的配置空间具有三个基地址寄存器(BAR),分别对应节点控制器从处理器端口的DMA模块、IOAPIC模块和远程Load/Store模块。在主处理器的角度,节点控制器是挂接在总线0(Bus0)上的两个设备,一个是系统总线终端设备(Endpoint),另一个是系统总线的桥设备。其中作为系统总线终端设备的配置空间具有三个基地址寄存器(BAR),分别对应节点控制器主处理器端口的DMA模块、IOAPIC模块和远程Load/Store模块。其中作为系统总线桥设备之后的总线1(Bus1)上挂接一个I/O总线根设备(Root Complex),I/O总线根设备之后的总线2(Bus2)挂接I/O总线的终端设备或桥设备。
本发明的节点控制器通过支持全局地址空间来实现节点内资源(包括内存和I/O设备等)的共享。因此,在每个处理器端口中,除实现标准的设备配置空间外,还需设置全局地址空间专用寄存器17。图10是本发明的节点控制器各个端口全局地址分配及窗口寄存器的示意图,如图10所示,本发明的节点控制器使用静态分配的方式隔离各个端口的地址空间,每个地址窗口最大为:
其中MAXBIT是系统地址位宽,例如使用HT系统总线,若HT最大支持40位地址宽度,则MAXBIT等于40,若HT最大支持64位地址宽度,则MAXBIT等于64。
各端口窗口信息全局共享,相当于一个路由表,供数据传递时查询。主处理器端口拥有两个窗口,窗口0对应了其本地内存和外设空间,窗口1对应了其全局地址空间。从处理器端口和I/O端口分别只拥有一个标识其全局地址空间的窗口,窗口的起始和终止范围由每个窗口中的配置寄存器存储。
主处理器端口窗口0的MEM_START和MEM_END对应了其本地内存的地址范围,DEV_STARAT和DEV_END对应其设备空间,窗口1的GAS_START和GAS_END对应了该端口在全局地址中的地址范围,值得注意的是,窗口1的GAS_START和GAS_END相对于窗口1上边界的偏移分别等于MEM_START和MEM_END。从处理器端口的GAS_START和GAS_END对应了该端口在全局地址中的地址范围,这个范围的大小等同于从处理器1#的本地内存大小。I/O端口的GAS_START和GAS_END对应了该端口在全局地址中的地址范围,值得注意的是I/O端口的GAS_START和GAS_END相对于窗口1上边界的偏移分别等于DEV_START和DEV_END。
本发明的有益效果在于:
1.实现多个处理器间松散耦合互连,相比于传统的SMP或ccNUMA系统,不仅增强了节点的可扩展性,提高节点密度,而且单一从处理器的故障不会导致系统停顿,提高了系统可靠性;
2.支持全局统一地址空间,对节点内的内存和I/O设备进行统一编址,内存和I/O设备都对应一系列的全局地址,节点内每个处理器都可以通过使用携带全局地址的Load/Store指令实现对节点内存和I/O设备的访问,即实现节点内处理器对节点内存和I/O设备的共享;
3.控制器为每个处理器端口设置DMA引擎,实现处理器间高效的数据传输,且DMA引擎的设计可以容忍系统总线的乱序响应特性;
4.通过在控制器内部分别为Load/Store和DMA设置两个交叉开关,减少大块数据和短数据传输的互扰,提高通信效率;
5.控制器内部的交叉开关采用双虚通道设计,数据对虚通道的使用,与目的端口号的奇偶进行绑定,实现了同源同目的数据的保序,并大大降低队头阻塞,提高了传输效率;
6.控制器对外接口采用标准工业总线,且内部实现完整的PCI拓扑,为使用商用设备提供保证;
7.由于系统的外设发现配置由主处理器完成,因此只要保证主处理器是主流处理器,就可以最大程度兼容商用设备。即使从处理器是新型处理器,也可以实现从处理器对外设的访问,进而降低了系统升级成本,并在一定程度上兼容异构处理器。
通过结合附图对本发明具体实施例的描述,本发明的其它方面及特征对本领域的技术人员而言是显而易见的。
以上对本发明的具体实施例进行了描述和说明,这些实施例应被认为其只是示例性的,并不用于对本发明进行限制,本发明应根据所附的权利要求进行解释。