一种用于在多核平台下优化关键临界区的方法

文档序号:6523520阅读:192来源:国知局
一种用于在多核平台下优化关键临界区的方法
【专利摘要】本发明公开了一种用于在多核平台下优化关键临界区的方法,包括:工作线程在主程序入口创建全局锁信息管理列表,用于存储锁和其对应的任务队列之间的关联关系,工作线程接收并执行并行任务,根据并行任务对锁发出加锁请求,并判断加锁是否成功,如果成功则工作线程在内存中为新的任务队列分配空间,以获取该任务队列的起始地址,工作线程将锁与获取的任务队列的起始地址之间的关联关系存储在全局锁信息管理列表中,工作线程在全局锁信息管理列表中存储该新的任务队列初始化完毕的信息,工作线程进入临界区执行并行任务,并判断执行并行任务期间是否有新的并行子任务生成。本发明能够解决现有多核平台下临界区过大导致程序性能降低的技术问题。
【专利说明】—种用于在多核平台下优化关键临界区的方法
【技术领域】
[0001]本发明属于计算机系统多核环境下的多线程编程【技术领域】,更具体地,涉及一种用于在多核平台下优化关键临界区的方法。
【背景技术】
[0002]受功耗、性能等诸多因素的影响,人们目前几乎已经不再具备建造更大更快的单核处理器的能力。现在处理器制造厂商纷纷采用片上多处理器(Chip multiprocessor,简称CMP)结构,并成功地推出了各自的多核(Mult1-core)产品,有些厂商甚至还开发出了众核(Many-core)芯片的原型。商业上的成功不仅证明这种结构是完全可行的,也向人们展示了它的巨大发展潜力,即完全可以在单个芯片内集成数量更多的处理器内核,实现性能更加强大的众核处理器。为了适应核数更多的处理器,主流并行编程框架的运行时系统不会为每个新生成的子任务额外开启一个线程,而是由若干个工作线程来调度及执行子任务。
[0003]虽然众核多核体系结构能提供更多更丰富的计算资源,并且主流并行编程框架也愈发完善;但资源竞争会带来额外的开销(例如任务切换开销,CPU饥饿,串行化问题),这对众核计算带来了巨大的影响,让系统效率直线下降直至弱于串行执行的效率。特别当核数众多的时候,资源竞争会带来更大的性能损失。在众多资源竞争场景中,关键临界区过大是其中一个比较典型且危害巨大的问题,它会使大量CPU陷入空转,导致计算资源的浪费。
[0004]以下就一个典型的应用场景来详细说明关键临界区过大在现有的主流并行编程框架下对并行程序效率的危害:并行哈希表结构在众多场合下被广泛使用,如互联网中一些信息拥有较多读取次数和较少的修改次数(例:记录当前在线用户ID),那么这些数据需要在服务器上使用哈希表进行缓存。并行哈希表提供一系列指向哈希桶的并行指针;单个桶内由链表连接,单个链表内有对应互斥锁保护;整个并行哈希表需要随时扩容,所以有一个读写锁保护。当我们有多个任务同时向一个并行哈希表中插入数据时,需对相应桶上锁并获取整个哈希表的读锁。当插入导致桶溢出时,自动增加表的全局溢出计数器。当超过一定数量的桶溢出时,该插入操作将引起一次扩容(resize)操作。扩容操作获取整个哈希表的写锁,并申请扩大哈希表空间、增加Hash桶的数目,之后重新将旧数据映射到新的哈希表空间内,这个重新映射的过程可以并行化,会产生可并行子任务。而此时,其他的插入操作任务由于获取不到整个表的读锁已被暂停,这导致承载任务的相应工作线程被暂停,无法帮助执行重新映射过程中的可并行子任务。此时便产生了 CPU饥饿问题,实验中使用OpenMP框架验证该CPU饥饿问题,如图1所示:有8个工作线程,8个并行任务同时往一个并行哈希表中插入随机数据,在25秒时刻左右及45秒时刻左右都产生了严重的CPU饥饿问题,即有可并行子任务,但却只有一个CPU在进行计算,其余CPU都空闲。
【发明内容】

[0005]针对现有技术的以上缺陷或改进需求,本发明提供了一种用于在多核平台下优化关键临界区的方法,其目的在于,解决现有多核平台下临界区过大导致程序性能降低的技术问题。
[0006]为实现上述目的,按照本发明的一个方面,提供了一种用于在多核平台下优化关键临界区的方法,包括以下步骤:
[0007](I)工作线程在主程序入口创建全局锁信息管理列表,用于存储锁和其对应的任务队列之间的关联关系;
[0008](2)工作线程接收并执行并行任务,根据并行任务对锁发出加锁请求,并判断加锁是否成功,如果成功则转入步骤(3),如果失败则转入步骤(10);
[0009](3)工作线程在内存中为新的任务队列分配空间,以获取该任务队列的起始地址;
[0010](4)工作线程将锁与步骤(3)中获取的任务队列的起始地址之间的关联关系存储在全局锁信息管理列表中;
[0011](5)工作线程在全局锁信息管理列表中存储该新的任务队列初始化完毕的信息;
[0012](6)工作线程进入临界区执行并行任务,并判断执行并行任务期间是否有新的并行子任务生成,如果有则转入步骤(7),否则过程结束;
[0013](7)工作线程查询全局锁信息管理列表,并将新的并行子任务存储在锁关联的任务队列中;
[0014](8)工作线程判断是否所有的并行子任务均已生成完毕,如果是则转入步骤(9),否则返回步骤(6);
[0015](9)工作线程依次从锁关联的任务队列中获取并行子任务并执行该并行子任务,直至所有并行子任务都处理完毕为止,然后过程结束;
[0016](10)工作线程查询全局锁信息管理列表,以判断锁是否与获取的任务队列的起始地址之间存在关联关系,若存储有,则转入步骤(11),否则工作线程暂停工作0.5秒至I秒后,重复步骤(10);
[0017](11)工作线程查询锁关联的任务队列,并判断该任务队列是否不为空,若不为空则转入步骤(12),否则过程结束;
[0018](12)工作线程依次从锁关联的任务队列中获取并行子任务并执行该并行子任务,直至所有并行子任务都处理完毕为止,然后过程结束。
[0019]优选地,步骤(2)具体为,如果加锁失败,则工作线程接收到非零的随机整数值,如果加锁成功,则工作线程接收到为零的整数。
[0020]总体而言,通过本发明所构思的以上技术方案与现有技术相比,能够取得下列有益效果:
[0021]1、本发明提出了一种并行程序的调度流程,即当临界区过大时,工作线程不暂停等待,而是协助执行大型临界区,因此能够解决临界区过大导致并行程序性能降低的问题;
[0022]2、本发明由于增加额外的任务队列来对任务进行调度,不改变并行编程模型原有的队列,因此可适用于大部分的并行编程模型;
[0023]3、本发明由于将复杂的逻辑封装起来,应用时只需链接基于本发明的动态链接库,并简单修改自己的源代码就可以处理临界区过大导致并行程序效率降低这一类问题,因此对程序员负担较小。
【专利附图】

【附图说明】[0024]图1是现有技术中由于临界区过大引起的CPU饥饿的示意图。
[0025]图2是本发明用于在多核平台下优化关键临界区的方法的流程图。
【具体实施方式】
[0026]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
[0027]以下首先对本发明的术语进行解释和说明:
[0028]锁:在多线程执行的并行程序中保护临界区的同步原语,即在锁的保护下,同时最多只有一个工作线程执行临界区内的代码段。
[0029]如图2所示,本发明用于在多核平台下优化关键临界区的方法包括以下步骤:
[0030](I)工作线程在主程序入口创建全局锁信息管理列表,用于存储锁和其对应的任务队列之间的关联关系;
[0031](2)工作线程接收并执行并行任务,根据并行任务对锁发出加锁请求,并判断加锁是否成功,如果成功则转入步骤(3),如果失败则转入步骤(10);具体而言,如果加锁失败,则工作线程接收到非零的随机整数值,如果加锁成功,则工作线程接收到为零的整数;需要注意的是,本发明的应用场景是在多个线程的情况下的并行处理过程,在当前的工作线程加锁成功时,其它的工作线程均加锁失败;
[0032](3)工作线程在内存中为新的任务队列分配空间,以获取该任务队列的起始地址;
[0033](4)工作线程将锁与步骤(3)中获取的任务队列的起始地址之间的关联关系存储在全局锁信息管理列表中;具体而言,使用哈希表数据结构存储关联关系。
[0034]本步骤的优点在于,将锁与关联任务队列全局统一管理,便于查询;使用哈希表存储关联关系能提闻查询效率。
[0035](5)工作线程在全局锁信息管理列表中存储该新的任务队列初始化完毕的信息;
[0036]本步骤的优点在于,存储初始化完毕信息,便于其他工作线程判断当前任务队列的状态。
[0037](6)工作线程进入临界区执行并行任务,并判断执行并行任务期间是否有新的并行子任务生成,如果有则转入步骤(7),否则过程结束;
[0038](7)工作线程查询全局锁信息管理列表,并将新的并行子任务存储在锁关联的任务队列中;
[0039](8)工作线程判断是否所有的并行子任务均已生成完毕,如果是则转入步骤(9),否则返回步骤(6);
[0040](9)工作线程依次从锁关联的任务队列中获取并行子任务并执行该并行子任务,直至所有并行子任务都处理完毕为止,然后过程结束;
[0041]( 10)工作线程查询全局锁信息管理列表,以判断是否存储有新的任务队列初始化完毕的信息,即锁是否与获取的任务队列的起始地址之间存在关联关系,若存储有,则转入步骤(11 ),否则工作线程暂停工作0.5秒至I秒后,重复步骤(10);[0042](11)工作线程查询锁关联的任务队列,并判断该任务队列是否不为空,若不为空则转入步骤(12),否则过程结束;
[0043]( 12)工作线程依次从锁关联的任务队列中获取并行子任务并执行该并行子任务,直至所有并行子任务都处理完毕为止,然后过程结束。
[0044]本步骤的优点在于,工作线程不等待,而是协助执行大型临界区内的并行子任务,因此可提高CPU使用率,充分发挥多核平台的计算能力。
[0045]本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种用于在多核平台下优化关键临界区的方法,其特征在于,包括以下步骤: (1)工作线程在主程序入口创建全局锁信息管理列表,用于存储锁和其对应的任务队列之间的关联关系; (2)工作线程接收并执行并行任务,根据并行任务对锁发出加锁请求,并判断加锁是否成功,如果成功则转入步骤(3),如果失败则转入步骤(10); (3)工作线程在内存中为新的任务队列分配空间,以获取该任务队列的起始地址; (4)工作线程将锁与步骤(3)中获取的任务队列的起始地址之间的关联关系存储在全局锁信息管理列表中; (5)工作线程在全局锁信息管理列表中存储该新的任务队列初始化完毕的信息; (6)工作线程进入临界区执行并行任务,并判断执行并行任务期间是否有新的并行子任务生成,如果有则转入步骤(7),否则过程结束; (7)工作线程查询全局锁信息管理列表,并将新的并行子任务存储在锁关联的任务队列中; (8)工作线程判断是否所有的并行子任务均已生成完毕,如果是则转入步骤(9),否则返回步骤(6); (9)工作线程依次从锁关联的任务队列中获取并行子任务并执行该并行子任务,直至所有并行子任务都处理完毕为止,然后过程结束; (10)工作线程查询全局锁信息管理列表,以判断锁是否与获取的任务队列的起始地址之间存在关联关系,若存储有,则转入步骤(11 ),否则工作线程暂停工作0.5秒至I秒后,重复步骤(10); (11)工作线程查询锁关联的任务队列,并判断该任务队列是否不为空,若不为空则转入步骤(12),否则过程结束; (12)工作线程依次从锁关联的任务队列中获取并行子任务并执行该并行子任务,直至所有并行子任务都处理完毕为止,然后过程结束。
2.根据权利要求1所述的方法,其特征在于,步骤(2)具体为,如果加锁失败,则工作线程接收到非零的随机整数值,如果加锁成功,则工作线程接收到为零的整数。
【文档编号】G06F9/48GK103699363SQ201310681619
【公开日】2014年4月2日 申请日期:2013年12月13日 优先权日:2013年12月13日
【发明者】廖小飞, 金海 , 丁海淼, 章勤, 范学鹏 申请人:华中科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1