多核并行先进先出队列处理系统及方法
技术领域
本发明涉及一种多核处理器系统对共享资源的访问技术,尤其涉及先进先出队列多核并行处理技术。
背景技术
随着网络通信技术的迅猛发展,网络客户对网络要求越来越高,传统的单处理器在处理性能上越来越不能适应需要,因此多核处理器得到了越来越多网络设备提供商的青睐。在多核处理器系统中,对共享临界资源的互斥操作是影响其性能的关键因素之一。目前通常的做法是通过对共享资源加锁来实现互斥操作,队列是共享资源的主要组织形式之一。
为了保证多核处理器的多个核之间对队列操作的互斥,每个核在操作队列时加锁,此时其它核在对队列进行操作时会失败,在取得锁的核操作完毕并且解锁以后其它核对队列的访问才能够成功,因此在CPU的核数目非常多时这种操作会导致CPU的效率急剧下降。
发明内容
本发明所要解决的技术问题是:克服现有技术中,软件加锁来实现多核处理器操作队列性能较低的缺点,提供一种队列处理技术,以提高多核处理器并行操作队列时的效率。
本发明为解决上述技术问题所采用的技术方案是:所述提供一种多核并行先进先出队列处理系统:多个核通过CPU接口总线与自动排号装置相连;自动排号装置包括:读地址产生模块、写地址产生模块、队列序号存储器、读回数据产生模块、加1模块;CPU接口总线通过读地址产生模块与队列序号存储器的读地址相连,CPU接口总线通过写地址产生模块与队列序号存储器的读地址相连,读回数据产生模块分别与队列序号存储器、CPU接口总线、加1模块相连,加1模块还与队列序号存储器相连;
读地址产生模块,用于每个核读队列序号存储器时,根据该核送出的地址,产生入队序号寄存器地址和出队序号寄存器地址,送到队列序号存储器的读地址;
写地址产生模块,用于将每个核送出的地址锁存给队列序号存储器的写地址;
队列序号存储器能分别从入队序号寄存器地址、出队序号寄存器地址中读出入队序号、出队序号;队列序号存储器读出读地址中入队序号和出队序号送到读回数据产生模块锁存;将写地址中的入队序号和出队序号送到读回数据产生模块锁存;队列序号存储器包括入队序号寄存器、出队序号寄存器,入队序号寄存器、出队序号寄存器分别存储当前队列的入队序号、出队序号;
读回数据产生模块,用于对队列序号存储器送出的入队序号和出队序号进行锁存;并判断入队序号与出队序号的相关性,若符合相关性,从队列序号存储器的写地址中选择需要输出的序号送加1模块,读回数据产生模块返回要输出的序号;若不符合相关性,读回数据产生模块返回告警信号到CPU接口总线;
加1模块,连接于读回数据产生模块和队列序号存储器之间,用于接收读回数据产生模块发送的序号,并加上1个地址计数单位后送到队列序号存储器。
上述的序号为自然数,所述1个地址计数单位为1。
优选的,为了使每次的读取操作少做一次地址偏移动作,设上述的序号为操作队列的地址值,所述1个地址计数单位为当前队列的1个操作单元地址的字节数。
本发明还提供了一种多核处理器中多核并行先进先出队列操作方法,包括以下步骤:
a、始化队列数组,并预设自动排号装置中入队序号寄存器和出队序号寄存器的初始值;
b、每个核读取自动排号装置中入队序号寄存器中的值确定数组位置,判断当前入队序号与出队序号的相关性,若符合相关性对队列数组实现入队操作,同时自动排号装置实现将当前入队序号寄存器中的值加1个计数单位;若不符合相关性,则返回告警信号给当前核。
c、每个核读取出自动排号装置中出队序号寄存器中的值确定数组位置,判断当前入队序号与出队序号的相关性,若符合相关性对队列数组实现出队操作,同时自动排号装置中实现将当前出队序号寄存器中的值加1个计数单位;若不符合相关性,则返回告警信号给当前核。
上述,入队序号与出队序号的相关性为:当入队时入队序号加1个地址计数单位后不等于出队序号;当出队时出队序号不等于入队序号。
本发明的有益效果是:本发明由于实现了多个核对同一队列的入队、出队操作完全不需要互斥,因此对多核处理系统性能有较大提升。并且出入队的效率同核的个数完全独立,也就是增加新的核对队列的操作几乎没有性能上的影响。对硬件要求较低,结构简单,对硬件资源占用少。
以下结合附图与实施例对本发明做进一步说明。
附图说明
图1为本发明的系统结构图;
图2为实施例自动排号装置的结构图。
具体实施方式
假如有10个任务需要3个核进行处理,任务0在入队时从自动排号机中取得一个序号0,于是将任务0放入数组第0个单元中,任务1在入队时从自动排号机中取得下一个序号1,于是将任务1放入数组第1个单元中…那么这10个任务通过一个自动排号装置分别领到0一9的号码,按照这个号码分别编入到队列数组中。这一部分是任务的入队操作。
下面核空闲时通过另外一个自动排号装置领到需要处理的号码:核0首先取得序号0,于是处理数组第0个单元对应的任务0,同时核1再从自动排号装置中取下一个序号1,于是处理数组1对应的任务1。每个核每处理完一个任务再从自动排号装置中取得下一个号码。这样三个核会保证将队列中所有的任务都顺序处理完毕而不会产生冲突。
在这个模型中,自动排号装置需要完成加1然后写的原子操作。如果用软件来实现又需要涉及到加锁,因此使用硬件来实现:如图1所示的多核并行先进先出队列处理系统:多个核通过CPU接口总线与自动排号装置相连;自动排号装置包括:读地址产生模块、写地址产生模块、队列序号存储器、读回数据产生模块、加1模块;CPU接口总线通过读地址产生模块与队列序号存储器的读地址相连;CPU接口总线通过写地址产生模块与队列序号存储器的写地址相连;读回数据产生模块分别与连接队列序号存储器、CPU接口总线、加1模块相连;加1模块连接于读回数据产生模块和队列序号存储器之间。
具体可通过FPGA来实现这个自动排号装置,采用一种可以预设初值的FPGA,保证队列先进先出的加1然后写的原子操作,产生每次读操作递加的序号,并且能够保证入队出队两个序号的相关性,自动排号装置以此为基础维护一个多核的无竞争多输入多输出的队列。对于队列长度为n的队列,初始化一个大小为n的数组。数组中放置所需要处理的任务指针。
自动排号装置每个队列地址应该可以设置初始序号,队列长度。每个队列的序号等于队列长度以后自动从0开始。对于一个队列至少应该实现两个队列地址,即入队地址、出队地址,可以分别从这两个地址读出入队序号和出队序号。入队序号与出队序号有相关性:出队地址不应该等于入队地址,入队地址在绕回以后加1不能等于出队地址,即当入队时入队地址加1不能等于出队地址以及出队时出队地址不能等于入队地址。
在FPGA中的初始值设置为数组的首地址,每次读操作FPGA自动增加1个地址计数单位,该1个地址计数单位为当前队列的1个操作单元地址的字节数,即4。则能够保证每次从FPGA中读取的值即为下一个序号对应数组指针。相比设置1个地址计数单位为自然数,可以使软件少做一次从首地址偏移的动作。FPGA有一个先读后写的寄存器操作,为实现成百上千个这样的寄存器,可使用内嵌双口RAM。
FPGA与每个核接口方法有:核的通用I/O脚;核的扩展总线;PCI总线的slave设备;HT总线的端点设备;PCI-Express总线的端点设备;仿真DDR DDR2内存接口等。
如图2所示的自动排号装置,包括地址译码器、2选1逻辑模块、写信号产生模块、读地址产生模块、写地址产生模块、队列序号存储器、读回数据产生模块、加1模块。
多个核通过地址线分别与地址译码器、写信号产生模块、读地址产生模块、写地址产生模块相连后,再与队列序号存储器相连;每个核读写信号通过写信号产生模块与队列序号存储器相连;每个核写数据通过2选1逻辑模块与队列序号存储器相连;队列序号存储器通过读回数据产生模块输出数据,读回数据产生模块通过加1模块将读回数据加1输回到队列序号存储器。
队列序号存储器采用FPGA的内嵌双口RAM,包括有入队序号寄存器、出队序号寄存器。每一个队列只需要硬件存储当前入队地址和出队地址,每个地址占用4字节地址,因此只需要硬件辅助提供4字节存贮空间。系统可实现对多个队列的入队、出队操作,即队列序号存储器分别为每个队列提供2个4字节的存贮空间,2个存贮空间分别记录该队列当前的入队地址和出队地址。设置加1操作为每次读入队和出队地址序号递加值为4,即一个指针长度。
初始化操作时,2选1逻辑模块检测到来自CPU接口总线的写地址操作信号,接通CPU接口总线与双口RAM,每个核通过对一个写地址操作来初始化入队、出队序号寄存器的值,同时将入队地址和出队地址设置为两个相邻的地址。
正常工作后,每当核读入队地址时,读地址产生模块根据CPU给出的地址自动产生入队地址和出队地址,送给队列序号存储器的读地址,队列序号存储器在读地址中读出要操作的当前队列的入队地址和出队地址对应的序号,送到读回数据产生模块锁存;另一方面,入队地址通过写地址产生模块被锁存给队列序号存储器的写地址。核的读脉冲经写信号产生模块处理后变成双口RAM的写脉冲,读回数据产生模块从队列序号存储器的写地址中选择需要输出的序号加1后写回双口RAM的入队序号寄存器中,2选1逻辑模块检测到来自加1模块的写操作,接通加1模块与双口RAM,从而实现入队序号寄存器读后加1的功能,设置入队地址的指针为任务指针;另外,读回数据产生模块如果发现入队序号加1后等于出队序号,即队列将满,读回数据产生模块将控制回写的信号不被加1,同时设置核读回数据为“满”的告警信号,以通知核,入队操作失败。
每当核读出队地址时,读地址产生模块也会连续产生入队地址和出队地址送给队列序号存储器的读地址,入队序号和出队序号从队列序号存储器送到读回数据产生模块锁存,出队序号寄存器的序号通过读回数据产生模块送出;另一方面,出队地址被锁存给队列序号存储器写地址,核读脉冲经写信号产生模块处理后变成双口RAM的写脉冲将CPU读回数据加1后的数据写回双口RAM的出队序号寄存器中,2选1逻辑模块检测到来自加1模块的写操作,接通加1模块与双口RAM,从而实现出队序号寄存器读后加1的功能,设置出队地址的指针为任务指针;另外,读回数据产生模块如果发现出队序号寄存器读出来后等于入队序号寄存器的值,即队列将空,读回数据产生模块将控制回写的信号不被加1,同时设置核读回数据为“空”的告警信号,以通知核,出队操作失败。