多核系统中单生产者/单消费者队列的处理方法及装置的制作方法

文档序号:6481642阅读:196来源:国知局
专利名称:多核系统中单生产者/单消费者队列的处理方法及装置的制作方法
技术领域
本发明涉及一种多核系统的处理方法及装置,尤其涉及一种多核系统中单生产者 /单消费者队列的处理方法及装置。
背景技术
随着处理器指令集并行化空间的日益减少,再加上对能耗关注程度的增加,单处 理器的发展速度正在逐步减慢,这最终导致多核处理器系统时代的到来。为充分发掘多核处理器系统的性能,运行在多核系统上的应用软件需要采用适 当的并行化方法。基本的并行化方法包括任务级并行(TaskParallelism),数据级并行 (Data Parallelism),流水线并行(PipelineParallelism)。由于大部分应用软件很难使用 简单的任务级并行和数据级并行化方法进行并行化,流水线并行化方法正受到越来越多的 关注。下面结合图1对流水线并行化方法进行描述,在描述过程中假设工作A被分割为 依次相连的三个部分,分别为工作1,工作2,工作3。处理核1先完成工作A中的工作1,然 后将该工作通过一条队列传递给处理核2,处理核2在完成工作A中的工作2后将该工作通 过一条队列传递给处理核3,处理核3完成工作A中的工作3。处理核3的工作完成后,工 作A被全部完成。参照图2所描述的在流水线并行方法中,处理核之间通过单生产者/单消费者模 式先进先出队列依次相连,处理核之间通过该队列进行通信。该队列的性能直接影响到多 核体系结构上流水线并行化方法的性能,从而影响应用软件在多核结构上的性能。下面结合图3阐述传统队列方法共享存储器被用于多核系统下不同处理核间的 相互通信。具体来说,存储器可被多个处理核访问,并且这些处理核使用驻留在共享存储器 中的队列进行通信。例如,两个处理核使用共享存储器中的一个先进先出队列进行数据的 传递。在这里描述的例子中,生产者产生新数据,运行在第一个处理核上,使用enqueue函 数进行入队列操作;消费者消耗数据,运行在第二个处理核上,使用dequeue函数进行出队 列操作;生产者及消费者通过共享存储器中的一个先进先出队列buffer进行数据的传递。对传统的单生产者/单消费者模式队列的操作,可通过以下代码进行描述_1 enqueue(data){ //生产者一端数据入队列函数2if(NULL ! = buffer[head]){ / /判断队列是否已满3 return EWOULDBLOCK ; 4 }5 buffer[head] = data ; //入队操作,将数据写入共享存储器6 head = (head+1) % size ;7 returnO8 }1 dequeue(data){ //消费者一端数据出队列函数
2345678
data = buffer[tail]; if(NULL = data) {
return EWOULDBLOCK ;
II出队操作,从共享存储器读出数据 II判断队列是否已空
buffer[tail] = NULL ; tail = (tail+1) % size ; returnO ;9 }生产者首先判断队列是否已满,如果队列未满,那么生产者做入队操作,将数据写 入队列中。然后,生产者指向队列的下一元素位置,作为一个例子,可以使用下面的伪代码 head = (head+1) % size,其中size为队列的大小,使用取模运算来确定队列头部的值。 消费者首先判断队列是否为空,如果队列不空,那么消费者做出队操作,将数据从队列中读 出。然后,消费者指向队列的下一元素位置,可以使用下面的伪代码tail = (tail+1) %如图3所示,多核处理器系统中,多个处理核通过同一条系统总线共享一个物理 存储器,在处理核与物理存储器间是多层次的处理核缓存(cache)。处理核缓存的引入,一 方面减少了处理核对数据的平均访问时间和处理核对存储器带宽的需求;另外一方面,由 于同一数据可能同时存在于多个处理核缓存中,多核处理器系统需要运行缓存一致性协议 (cache coherenceprotocols)来维护多个数据副本的一致性。处理核缓存的最小单位定义为缓存块(cache line),处理核缓存以缓存块为单位 与存储器进行数据交换。因此,假设某多核处理器系统缓存块大小为64字节(byte),处理 核对该缓存块64字节内任意字节的读或写操作均可能引起系统对该缓存块运行缓存一致 性协议。在实现本发明的过程中,发明人发现传统队列中至少存在如下问题1)由于硬件系统中每个缓存块(cache line)只有一个标识位来表示该缓存块 是否有效。当生产者和消费者同时操作同一缓存块内的数据时,即使它们没有操作同一数 据,为维护多个处理核缓存中数据的一致性,系统运行无效的缓存一致性协议,造成假共享 (false sharing)缓存缺失,假共享缺失导致处理核间通信以将它们各自的缓存块同步。2)对同一缓存块内的多个数据,生产者需要进行多次写操作。为维护多个处理核 缓存中数据的一致性,系统可能需要多次运行缓存一致性协议通告缓存块无效,为此,总线 需要为一致性协议负担大量的通讯。基于前述的原因,需要一种适应多核处理器系统特殊性的单生产者/单消费者先 进先出队列来支持核间通信。该队列必须能够消除伪共享缓存缺失,能够充分地减少多核 处理器系统中缓存一致性协议的开销。

发明内容
本发明的目的就是为了解决现有技术中存在的上述问题,提供一种多核系统中单 生产者/单消费者队列的处理方法及装置。本发明的目的通过以下技术方案来实现
4
多核系统中单生产者/单消费者队列的处理方法,其中所述的多核系统中至少 在生产者的一端设有私有缓存区及定时器,生产者产生新数据时,该新数据写入私有缓存 区中,当且仅当私有缓存区满时或定时器溢出时,生产者才将私有缓存区中的所有数据一 次性写入队列中。上述的多核系统中单生产者/单消费者队列的处理方法,其中所述的写入包括 以下步骤,首先确定队列为不满的状态;随后将数据拷贝到队列中;最后将队列头指针指 向下一合适写入的位置等待新的写入操作。进一步地,上述的多核系统中单生产者/单消费者队列的处理方法,其中所述的 定时器溢出为,首先给定时器设定一个时间间隔值,从系统启动时刻起,定时器进入计时状 态并在时间间隔值后发生溢出,向生产者发送一个时间激励信号,之后定时器清零并再次 进入计时状态。更进一步地,上述的多核系统中单生产者/单消费者队列的处理方法,其中所述 的生产者及消费者是分别运行在多核系统的两个处理核上的处理实体,生产者与消费者之 间采用队列进行通信。更进一步地,上述的多核系统中单生产者/单消费者队列的处理方法,其中所述 的处理实体为一个进程或任务。更进一步地,上述的多核系统中单生产者/单消费者队列的处理方法,其中所述 的处理核为共享存储的多核系统中的处理单元。更进一步地,上述的多核系统中单生产者/单消费者队列的处理方法,其中所述 的私有缓存区是在共享存储器中开辟的一段内存单元,该内存单元仅被生产者访问。再进一步地,上述的多核系统中单生产者/单消费者队列的处理方法,其中所述 的私有缓存区的大小为多核系统中处理器缓存块大小的正整数倍。多核系统中单生产者/单消费者队列的处理装置,其特征在于包括有入队装置、 出队装置以及定时装置,入队装置及出队装置之间通过无锁队列进行连接及通信,定时装 置安装在入队装置一端并通过中断方式向入队装置提供时间激励信号。本发明技术方案的突出的实质性特点和显著的进步主要体现在引入基于处理核 缓存优化的私有缓存区,使操作队列的效率得到提高。通过引入定时器,消除了本发明中可 能出现的极端情况。由此,比传统队列性能提高35%以上。特别是在多种多核系统及多种 测试用例中,稳定性有极大的提升,能够消除伪共享缓存缺失,能够充分地减少多核处理器 系统中缓存一致性协议的开销。由此可见,本发明具有实质性技术特点和显著的技术进步, 其应用前景非常广阔。


本发明的目的、优点和特点,将通过下面优选实施例的非限制性说明进行图示和 解释。这些附图当中,图1是背景技术中流水线并行方法实施示意图;图2是背景技术中先进先出队列的实施示意图;图3是多核处理器体系的结构示意图;图4是本发明实施示意图。
图中各附图标记的含义如下1 消费者2 生产者3 共享存储器4 私有缓存区
具体实施例方式如图4所示的多核系统中单生产者2/单消费者1队列的处理方法,其特别之处在 于所述的多核系统中至少在生产者2的一端设有私有缓存区4及定时器,生产者2产生新 数据时,该新数据写入私有缓存区4中,当且仅当私有缓存区4满时或定时器溢出时,生产 者2将私有缓存区4中的所有数据一次性写入队列中。具体来说,该私有缓存区4是在共享存储器3中开辟的一段内存单元,该内存单元 仅被生产者2访问。私有缓存区4的大小为多核系统中处理器缓存块大小的正整数倍。就本发明一较佳的实施方式来看,写入包括以下步骤,首先确定队列为不满的状 态,随后将数据拷贝到队列中,将队列头指针指向下一合适写入的位置,最后将队列头指针 指向下一合适写入的位置等待新的写入操作。所述的定时器溢出为,首先给定时器设定一 个时间间隔值,从系统启动时刻起,定时器进入计时状态并在时间间隔值后发生溢出,向生 产者2发送一个时间激励信号,之后定时器清零并再次进入计时状态。本发明设计的多核系统中单生产者2/单消费者1队列的处理装置,其特别之处 在于包括有入队装置、出队装置以及定时装置,入队装置及出队装置之间通过无锁队列进 行连接及通信,定时装置安装在入队装置一端并通过中断方式向入队装置提供时间激励信 号。该无锁队列的一端被一个处理实体访问,将数据写入该队列;另一端被另一个处理实体 访问,从队列中读取数据。具体来说,生产者2及消费者1分别指运行在两个处理核上的处理实体,生产者2 与消费者1之间采用队列进行通信。具体来说,所述的处理实体为一个进程或任务。在某 种情况下,该些处理实体可以为进程或者任务,并且本实施例被用来在不同进程或者任务 间进行通信。在另外一种情况下,该处理实体为一个进程的线程,本实施例被用来在一个进 程的不同线程间进行通信。在生产者2及消费者1通信的过程中,队列中传递的元素的类型包括但不局限于 数据本身、消息。具体来说,对占用较大内存空间的元素,可通过在队列中传递该类元素在 共享存储器3中地址的指针,达到通信的目的,可尽量减少队列中的通信量。同时,队列、 入队以及出队操作可以被用于许多情形,包括但并不局限于进程间通信和进程内线程内通进一步来看,本发明提供了一种加入私有缓存区4的技术方案,旨在提高多核处 理器系统中队列操作的效率,下面结合图4来看在队列入队或出队元素前,该队列被初始化。例如,char queue [size]被用来初 始化该队列。队列的大小是缓存块(cache line)大小的正整数倍并足够大以使该队列不 会频繁达到满的状态。例如,该size参数的大小可设定为1024。为使队列queue中紧邻的 元素尽可能缓存到处理核缓存的同一缓存块中,在初始化该队列时,可强制指定队列在共 享存储器3中的起始位置。比如在队列使用属性_attribUte_((aligned(64)))。生产者2维护一私有缓存区4,其大小为缓存块大小的正整数倍且小于size的大小。例如,本实施例中,私有缓存区4大小为缓存块大小的1倍,即为64字节。chartemp [64] 被用来初始化该私有缓存区4,该缓存区仅被生产者2访问。当生产者2需要进行入队操作时,其将数据保存在私有缓存区4中后工作完成并 返回。当私有缓存区4中数据满时,生产者2进行一次入队操作,将私有缓存区4中的所有 数据一次性写入共享存储器3。然后,生产者2指向队列中下一缓存块的位置。举例来说, 可以使用下面的伪代码head = (head+64) % size,其中size为队列的大小。结合实际处理情况来看,在入队频率较慢等极端情况下,私有缓冲区需要较长的 时间才能达到满的状态。此时,导致私有缓存区4写入共享缓存器有较大时延,过大的时延 可能导致消费者1 一端的程序产生错误。为解决此问题,生产者2的一端加入了定时器。 定时器可周期性地向生产者1发出时钟溢出中断。例如,在本实施例中,定时器每1ms发生 一次溢出,并将私有缓存区4中的数据进行入队操作,由于此时私有缓存区4未达到满的状 态,其中的部分数据依然为空(NULL),标记为空的数据因不包含有用信息,所以是无效的。再进一步来看,消费者1 一端的工作与传统队列中消费者1 一端的工作区别在于 第一,每次出队操作所获得的元素个数等于私有缓存区4的大小。每次出队操作后,消费 者1指向队列中下一缓存块的位置,即消费者1指向队列中的位置向后移动,移动的距离为 私有缓存区4的大小。举例来说,可以使用下面的伪代码tail = (tail+64) % size,其中 size为队列的大小。第二,由于生产者2 —端设有定时器,消费者1 一端每次出队操作所获 得的多个元素并不能被保证都是有效的。为此,消费者1对出队操作所获得的每个元素判 断是否为空(NULL),如果非空,则该元素中的数据是有效的。否则,该元素中的数据是无效 的,应该予以丢弃。 同时需要注意的是,本发明中定时器的功能,仅仅是为了处理极端情况保证程序 的正确性,由于在实际应用中其发生的频率很低,因此由定时器溢出操作带来的队列可能 传输部分无效数据的事实并不会影响到本发明带来的有益效果。结合本发明一较佳的实施方式来看,生产者2 —端的行为可用以下代码描述
1char temp [64] ; //生产者2私有缓存区4
2int enqueue (char氺data) { //2 一立溝入队f桑{乍
3if(NULL ! = queue[head])
4return EWOULDBLOCK ;
5temp [current] = *data ;//私有缓存区4未满,将数据缓存到缓存区

6current-++ ;
7if ((current >= 64) | | (timeout = TRUE)) {
II当私有缓存区4数据满或定时器溢出,将缓存区中所有数据入队
8memcpy(queue[head], temp,sizeof (char)水current);
9head = (head+64) % size ;
10current = 0 ;
11}
12return SUCCESS ;
13}
正常工作后,只有当私有缓存区4满,生产者2才进行一次入队操作将数据写入 共享存储器3。设私有缓存区4temp大小为M字节,队列中每个数据元素的大小可由函数 sizeofO计算得出,记为N字节,N通常小于等于8。为向原始队列中写入M字节大小的数 据,生产者2需要执行M/N次对共享存储器3的写操作。其中使用了除法操作并取结果值 的上整。为了本实施例中写入M字节大小的数据,生产者2仅需要执行1次对共享存储器 3的写操作,其写操作次数减少为原始队列的N/M。由于在本发明的实施例中,M值的大小 通常为N值大小的16倍至64倍之间,从而能显著地减少生产者2 —端对共享存储器3的 写操作的次数。更进一步来看一方面,由于对共享存储器3的写操作次数减少为传统队列的N/ M,例如,本实施例中,写操作次数减少为传统队列的1/64,因此,多核处理器系统极大地减 少了缓存一致性协议的运行次数,减少了系统总线通信负担。另一方面,由于入队列、出队 列操作的数据单位被调整为缓存块大小的正整数倍,有效地避免了生产者2及消费者1同 时操作同一缓存块内的数据的情况,完全避免了假共享缓存缺失。这些实施例仅是应用本发明技术方案的典型范例,凡采取等同替换或者等效变换 而形成的技术方案,均落在本发明要求保护的范围之内。具体来说,在不脱离本发明精神的 情况下可以有许多不同变化。例如——尽管上面提供了一种多核处理系统环境,但是其他的环境也可以从本发明中获得 益处。许多具有共享存储器3的环境能从本发明中得到益处,这包括但不限于共享二级处 理器缓存(share L2 cache)多核处理器系统。尽管该实施例中仅在生产者2 —端维护了私有缓存区4。在不脱离本发明精神的 情况下,消费者1 一端也可以维护类似的私有缓存区4。尽管该实施例中char类型数据被放置在队列中,在其他的实施例中,任何数据类 型或者消息以及其他附加消息可被设置在队列中。尽管该实施例的队列中每个元素大小为1个单位,在其他的实施例中,队列中的 每个元素大小不局限于此。尽管该实施例中定时器每1ms发生一次溢出。在不脱离本发明精神的情况下,该 定时器可被替换为任何具有产生时间激励信号能力的代码、固件、硬件或其组合。在其他的 实施例中,定时器的溢出间隔不局限于1ms。此外,尽管在本实施例中,缓存块的大小被假设为64字节,私有缓存区4大小为缓 存块大小的1倍,size的大小设定为1024,队列在共享存储器3中的起始位置64字节对 齐,队列以数据是否为空(NULL)来标识该数据是否有效。在不违背本发明精神的情况下, 实际操作中,它们的值可以更改。本发明可以设置在具有计算机可用介质的物品中。该介质在其中具有例如计算机 可读程序代码装置或者逻辑,例如指令,代码,命令等来提供和使用本发明的能力。该制造 物品可作为计算机系统的一部分或者单独出售。通过上述的文字表述并结合附图可以看出,采用本发明后,引入基于处理核缓存 优化的私有缓存区,使操作队列的效率得到提高。通过引入定时器,消除了本发明中可能出 现的极端情况,由此,性能比传统队列提高35%以上。特别是在多种多核系统及多种测试用 例中,稳定性有极大提升,能够消除伪共享缓存缺失,充分减少多核处理器系统中缓存一致性协议的开销,为应用软件在多核处理器系统中进行流水化并行铺平了道路。
权利要求
多核系统中单生产者/单消费者队列的处理方法,其特征在于所述的多核系统中至少在生产者的一端设有私有缓存区及定时器,生产者产生新数据时,该新数据写入私有缓存区中,当且仅当私有缓存区满时或定时器溢出时,生产者才将私有缓存区中的所有数据一次性写入队列中。
2.根据权利要求1所述的多核系统中单生产者/单消费者队列的处理方法,其特征在 于所述的写入包括以下步骤,首先确定队列为不满的状态;随后将数据拷贝到队列中;最 后将队列头指针指向下一合适写入的位置等待新的写入操作。
3.根据权利要求1所述的多核系统中单生产者/单消费者队列的处理方法,其特征在 于所述的定时器溢出为,首先给定时器设定一个时间间隔值,从系统启动时刻起,定时器 进入计时状态并在时间间隔值后发生溢出,向生产者发送一个时间激励信号,之后定时器 清零并再次进入计时状态。
4.根据权利要求1所述的多核系统中单生产者/单消费者队列的处理方法,其特征在 于所述的生产者及消费者是分别运行在多核系统的两个处理核上的处理实体,生产者与 消费者之间采用队列进行通信。
5.根据权利要求4所述的多核系统中单生产者/单消费者队列的处理方法,其特征在 于所述的处理实体为一个进程或任务。
6.根据权利要求4所述的多核系统中单生产者/单消费者队列的处理方法,其特征在 于所述的处理核为共享存储的多核系统中的处理单元。
7.根据权利要求1所述的多核系统中单生产者/单消费者队列的处理方法,其特征在 于所述的私有缓存区是在共享存储器中开辟的一段内存单元,该内存单元仅被生产者访 问。
8.根据权利要求1所述的多核系统中单生产者/单消费者队列的处理方法,其特征在 于所述的私有缓存区的大小为多核系统中处理器缓存块大小的正整数倍。
9.多核系统中单生产者/单消费者队列的处理装置,其特征在于包括有入队装置、出 队装置以及定时装置,入队装置及出队装置之间通过无锁队列进行连接及通信,定时装置 安装在入队装置一端并通过中断方式向入队装置提供时间激励信号。
全文摘要
本发明涉及一种多核系统中单生产者/单消费者队列的处理方法及装置。其至少在生产者的一端设有私有缓存区及定时器,生产者产生新数据时,该新数据写入私有缓存区中,当且仅当私有缓存区满时或定时器溢出时,生产者才将私有缓存区中的所有数据一次性写入队列中。本发明还包括有入队装置、出队装置以及定时装置,该队列的一端被一个处理实体访问,将数据写入该队列;另一端被另一个处理实体访问,从队列中读取数据。由此能够消除伪共享缓存缺失,充分减少多核处理器系统中缓存一致性协议的开销。
文档编号G06F9/38GK101853149SQ200910030030
公开日2010年10月6日 申请日期2009年3月31日 优先权日2009年3月31日
发明者唐锡南, 张力, 王俊昌 申请人:张力
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1