一种多核环境下OpenMP任务并行的优化方法

文档序号:6523464阅读:771来源:国知局
一种多核环境下OpenMP任务并行的优化方法
【专利摘要】本发明公开了一种多核环境下OpenMP任务并行的优化方法,主要是通过自适应任务粒度控制的方式帮助程序员控制好任务粒度,来优化任务并行,任务粒度是影响细粒度任务并行程序性能的一个重要因素。自适应任务粒度控制包括:1)帮助优先与串行化执行的自适应选取;2)限制细粒度任务的创建。在需要并行任务时采用帮助优先策略,任务数足够时采用串行化执行策略。设置了可以自动调节大小的阈值深度,用来限制细粒度任务的创建,若任务的深度大于阈值深度,则串行化执行。本发明能够自适应地控制好任务粒度,性能上和程序员手动控制的结果相接近,通过自适应的方式减轻了程序员的负担,并且还能节省内存。
【专利说明】—种多核环境下OpenMP任务并行的优化方法
【技术领域】
[0001]本发明属于计算机并行编程模型领域,更具体地,涉及一种多核环境下OpenMP任务并行的优化方法。
【背景技术】
[0002]由于功耗等方面的限制,仅仅通过提高主频来获取免费午餐的时代已经过去,多核技术已经成为时代的主流,但同时也提高了编写程序的难度,于是一些并行编程模型被广泛使用,OpenMP便是其中重要一员。
[0003]OpenMP原先主要用于处理以大数组为基础的比较规则的并行应用,但随着实际中应用的越来越复杂,非规则并行应用越来越多,如链表、树及图方面的一些应用以及一些递归应用,为此0penMP3.0引入了 “任务并行”,这是一种以任务为中心而非以线程为中心的并行程序编程方式,程序员可以使用并行任务编译指导语句“#pragma omp task”来表示这是一个可并行任务。任务并行已经广泛使用于Cilk, Cilk++,Intel TBB, Intel CilkPlus, X10, Microsoft TPL等之中。任务并行编程模型属于细粒度并行,用户只需把应用程序划分出大量细粒度任务,以后如何执行则交给运行时决定。
[0004]对于细粒度任务并行程序,控制好任务粒度至关重要。任务粒度问题简而言之就是决定程序员描述的一个可并行任务在运行时具体应该并行地执行还是应该串行地执行。因为若都并行地执行会创建过多的细粒度并行任务,产生大量的任务创建开销;但如果只创建少量的粒度并行任务,容易导致造成负载不平衡。合适的任务粒度是在保持并行度的情况下尽量降低任务创建的开销。
[0005]控制好任务粒度虽然十分重要,但却是一件是十分困难的事情。一些程序在输入不同的情况下其合适的粒度便不同,另外对于一些不规则的程序,它在何时会产生并行任务、产生多少并行任务以及并行任务的计算量等都是很难预测的,因此很难决定一个任务是否应该被创建为并行任务。目前GCC并没有在OpenMP运行时库中帮助程序员自动地控制任务粒度,这便加重了程序员的负担,对于非规则的程序,程序员手动控制的难度很大,过大或过小都会严重降低程序的性能。目前在其他任务并行编程模型上有一些控制任务粒度的研究,一些研究采用手动剪枝(cut-off)的策略,但只可以由并行任务转串行执行,却不能由串行执行转并行任务。也有自适应的方法,但各自存在一些问题,如只适合于二叉树的应用,不适合于多叉树;并未达到完全的自适应,并行和串行最多只能切换两次,容易出现负载不均衡;不适合于OpenMP等问题。

【发明内容】

[0006]针对现有技术的以上缺陷或改进需求,本发明提供了一种多核环境下OpenMP任务并行的优化方法,其目的在于,帮助程序员自适应的控制好任务粒度,实时创建合适数量的并行任务,保持负载平衡的同时降低系统开销,限制了细粒度任务的创建,节省不必要的内存分配,并且适合OpenMP的特性,减轻了程序员的负担。[0007]为实现上述目的,按照本发明的一个方面,提供了一种多核环境下OpenMP任务并行的优化方法,包括以下步骤:
[0008](I)初始化总线程数等于CPU核的数量,剪枝深度cut_off_depth和阈值深度threshold_depth为O,并将用于标识所有线程的状态位flag设置为O ;
[0009](2)主线程接收并行任务编译指导语句,以帮助优先的执行策略执行该并行任务编译指导语句,以生成并行任务,并将该并行任务放入该线程的并行任务队列的尾部;
[0010](3)主线程判断任务队列中的并行任务总和是否达到总线程数的N倍,其中N为正整数,若达到则进入步骤(4),否则返回步骤(2);
[0011](4)主线程将剪枝深度cut_off_cbpth设置为当前线程执行的并行任务的深度,并设置阈值深度 threshold_depth=2*cut_off_depth ;
[0012](5)当前线程采用串行化执行策略执行并行任务编译指导语句,此时不生成并行任务;
[0013](6)判断是否所有任务都已完成,若是则过程结束,否则转入步骤(7);
[0014](7)当前线程判断是否接收到并行任务编译指导语句,若接收到则转入步骤(8),否则返回步骤(5);
[0015](8)当前线程判断状态位flag是否为0,若是则转入步骤(9),否则表示存在有线程处于空闲状态且窃取不到并行任务,然后转入步骤(11);
[0016](9)当前线程判断其执行的并行任务的深度total_cbpth是否大于阈值深度threshold_depth,若大于则返回步骤(5),否则进入步骤(10);
[0017](10)当前线程判断其并行任务队列中的并行任务是否为空,或者所有线程的并行任务队列中的并行任务总数是否小于总线程数,如果是,则转入步骤(12),否则返回步骤
(5);
[0018](11)当前线程设置 threshold_ctepth=threshold_ctepth+cut_ofT_(fepth,f Iag=O ;
[0019](12)当前线程采用帮助优先的执行策略执行并行任务编译指导语句,以生成新的并行任务;
[0020](13)当前线程在接收到并行任务编译指导语句时,判断其执行的并行任务的临时深度是否大于剪枝深度cut_off_depth,若是则返回步骤(5),否则返回步骤(12)。
[0021]总体而言,通过本发明所构思的以上技术方案与现有技术相比,能够取得下列有益效果:
[0022](I)自适应地帮助用户自动控制粒度大小:目前GCC并没有提供十分有效的措施帮助用户自动控制好任务粒度,增加用户负担。有一些研究采用自适应的方式帮助用户控制粒度,但存在一些自身的问题,如未达到完全的自适应,最多只能切换两次,容易出现负载不均衡。本发明能自适应地帮助用户自动控制粒度大小,免除程序员的负担。
[0023](2)能限制细粒度任务的创建:目前有一些研究采用自适应的方法控制粒度大小,但没能限制细粒度任务的创建,导致需要频繁窃取和任务创建,另外一些粗粒度任务可能没有机会被创建,降低了程序的性能。本发明采用一些策略尽量保证产生的都是工作量比较大的并行任务,限制细粒度任务的创建。
[0024](3)在保持负载平衡的同时,降级系统开销,节省内存:目前GCC需要用户手动控制,容易出现负载不平衡或系统开销较大。一些研究采用预测每个分支大小的方式,也容易出现此类问题。另外一些研究采用的回溯法控制,容易引发负载不平衡。本发明能很好的兼顾这两者,另外串行化执行时一些原先为了并行执行而进行的空间拷贝便不再需要,相对原来的GCC能节省内存空间。
[0025](4)适合OpenMP的任务特性:最近有一些在其他任务并行编程模型上控制任务粒度的研究,但都是采用的工作优先的策略,即本线程执行刚产生的子任务,把未执行完的父任务放在队列中允许被偷走。OpenMP任务有非绑定与绑定两种,绑定属性的任务指一旦被执行便绑定到此线程上,因此工作优先策略容易导致负载不平衡,而本发明采用的帮助优先策略便不会有此问题。
【专利附图】

【附图说明】
[0026]图1是本发明所采用的工作-窃取调度方式的示意图。
[0027]图2是本发明多核环境下OpenMP任务并行的优化方法的具体流程图。
【具体实施方式】
[0028]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
[0029]以下首先就本发明的技术术语进行解释和说明:
[0030]并行任务编译指导语句=OpenMP提供给程序员用来描述可并行任务的语句,在OpenMP 中为“#pragma omp task”。
[0031]任务深度:任务在整个任务派生树中的深度,即递归调用的递归深度。
[0032]任务临时深度:是为任务添加的一个属性,当由串行化执行策略转换到帮助优先执行策略时便会设置为0,在循环采用帮助优先执行策略时会随着任务深度的增加而增加。
[0033]工作-窃取调度(Work-stealing):如图1所示,每个物理核有一个工作(Worker)线程,每个线程拥有一个双端任务队列,线程产生任务时,将任务放入双端任务队列的尾部,取任务时也是从双端任务队列的尾部取出,当队列为空时,去其它线程的队列头部窃取任务。工作-窃取调度具备两种执行策略:工作优先(Work-first)和帮助优先(Help-first),本发明使用帮助优先的执行策略。
[0034]帮助优先:工作-窃取调度中的一种执行策略,其当本线程遇到程序员标记的并行任务编译指导语句时创建并行子任务,并将刚产生的并行子任务放在自己的并行任务队列尾部,以便其他线程空闲时可以窃取走并执行,本线程则继续执行原来的父任务。
[0035]串行化执行策略:线程遇到并行任务编译指导语句不创建并行任务,而是当做串行程序执行。
[0036]剪枝深度:当达到此深度时,执行策略便要由帮助优先转换为串行化执行。
[0037]本发明主要通过自适应任务粒度控制的方式对OpenMP任务并行加以优化。它主要包括两个方面:1)帮助优先与串行化执行的自适应选取;2)限制细粒度任务的创建。这两个方面具体如下:
[0038]( I)帮助优先与串行化执行的自适应选取[0039]本发明通过帮助优先与串行化执行的自适应选取方式对任务粒度的大小加以控制,使程序员免除此负担。下面为具体步骤:
[0040]a)开始阶段,当前线程在遇到并行任务编译指导语句时,采用帮助优先策略将其生成为并行任务,并放入自己并行任务队列的尾部,以便其他线程空闲时可以窃取走执行,本线程则继续执行原来的父任务;
[0041]b)当前线程判断所有任务队列中的并行任务总和是否达到总线程数的N倍,其中N为正整数,取值范围为2至8。若达到则开始采用串行化执行策略完成遇到的并行任务编译指导语句,不生成并行任务;若未达到则返回a);
[0042]c)当前线程在采用串行化执行策略的过程中,若再遇到并行任务编译指导语句,需要判断当前线程是继续串行化执行,还是需要切换到帮助优先方式,判断策略如下:
[0043]c-1)是否有线程一直窃取不到并行任务,若有则切换到帮助优先执行策略,进入d);
[0044]c-2)若无则需要根据当前线程的并行任务队列是否为空或者所有并行任务队列中的总任务数是否小于总线程数进行判断,若为是,则采用帮助优先方式,生成并行任务,进入d);若为否,则采用串行化执行策略,不生成并行任务且返回c);
[0045]d)在采用帮助优先策略执行的过程中,若遇到并行任务编译指导语句,需要判断当前线程是否需要继续创建并行任务,判断方式为:当前线程所执行的任务临时深度是否大于剪枝深度cut-off,若为是则剪枝,切换到串行化执行策略,不生成并行任务,返回C);若为否则继续采用帮助优先策略,生成并行任务,循环执行d);
[0046](2)限制细粒度任务的创建
[0047]本发明能限制细粒度并行任务的创建,使被窃取的任务为工作量比较大的任务。方式如下:本发明添加一个“阈值深度”,当任务的深度值大于此阈值深度时,便不再创建并行任务,而是串行化执行;当任务的深度值小于此阈值深度时则还需要结合帮助优先与串行化执行的自适应选取方法进行判断。“阈值深度”的值根据情况会自动调整大小,当有线程空闲,但繁忙中的线程都由于所正在执行的任务当前深度大于阈值深度而无法创建并行任务时,阈值深度便会自动增加。
[0048]上面对优化方法的两个方面的实施方式分别进行了介绍,以下结合图2详细描述本发明多核环境下OpenMP任务并行的优化方法,具体包括以下步骤:
[0049](I)初始化总线程数等于CPU核的数量,剪枝深度cut_off_depth和阈值深度threshold_depth为O,并将用于标识所有线程的状态位flag设置为O ;
[0050](2)主线程接收并行任务编译指导语句,以帮助优先的执行策略执行该并行任务编译指导语句,以生成并行任务,并将该并行任务放入该线程的并行任务队列的尾部;
[0051](3)主线程判断任务队列中的并行任务总和是否达到总线程数的N倍,其中N为正整数,且取值范围是2至8,若达到则进入步骤(4),否则返回步骤(2);
[0052](4)主线程将剪枝深度cut_off_cbpth设置为当前线程执行的并行任务的深度,并设置阈值深度 threshold_depth=2*cut_off_depth ;
[0053](5)当前线程采用串行化执行策略执行并行任务编译指导语句,此时不生成并行任务;
[0054]( 6 )判断是否所有任务都已完成,若是则过程结束,否则转入步骤(7 );[0055](7)当前线程判断是否接收到并行任务编译指导语句,若接收到则转入步骤(8),否则返回步骤(5);
[0056](8)当前线程判断状态位flag是否为0,若是则转入步骤(9),否则表示存在有线程处于空闲状态且窃取不到并行任务,然后转入步骤(11);
[0057](9)当前线程判断其执行的并行任务的深度total_cbpth是否大于阈值深度threshold_depth,若大于则返回步骤(5),否则进入步骤(10);
[0058](10)当前线程判断其并行任务队列中的并行任务是否为空,或者所有线程的并行任务队列中的并行任务总数是否小于总线程数,如果是,则转入步骤(12),否则返回步骤
(5);
[0059](11)若繁忙中的线程都由于正在执行的任务深度大于阈值深度而无法创建并行任务,当前线程设置 threshold_depth=threshold_depth+cut_off_depth, fIag=O ;
[0060](12)当前线程采用帮助优先的执行策略执行并行任务编译指导语句,以生成新的并行任务;
[0061](13)当前线程在接收到并行任务编译指导语句时,判断是否要进行cut-off剪枝若是则返回步骤(5),否则返回步骤(12)。
[0062]我们分别使用Nqueens、sort和floorplan, strassen测试程序进行了测试,本发明的自适应任务粒度控制和程序员手动控制运行时间比分别为:0.97,1.03,0.98,0.97。可以看出自适应的方式和手动控制的方式两者性能相接近。
[0063]综上所述,本发明多核环境下OpenMP任务并行的优化方法主要通过自适应任务粒度控制的方式来完成优化。自适应任务粒度控制主要包括两个方面:1)帮助优先与串行化执行的自适应选取;2)限制细粒度任务的创建两部分。本发明能自动地控制任务粒度,免除程序员的负担,避免创建过多的细粒度并行任务而产生大量的任务创建开销或并行任务过少而负载不平衡的状况,而且还能节省内存,适合OpenMP的任务特性等,性能上和手动控制相接近。
[0064]本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种多核环境下OpenMP任务并行的优化方法,其特征在于,包括以下步骤: (1)初始化总线程数等于CPU核的数量,剪枝深度cut_0fT_depth和阈值深度threshold_depth为O,并将用于标识所有线程的状态位flag设置为O ; (2)主线程接收并行任务编译指导语句,以帮助优先的执行策略执行该并行任务编译指导语句,以生成并行任务,并将该并行任务放入该线程的并行任务队列的尾部; (3)主线程判断任务队列中的并行任务总和是否达到总线程数的N倍,其中N为正整数,若达到则进入步骤(4),否则返回步骤(2); (4)主线程将剪枝深度cUt_0ff_cbpth设置为当前线程执行的并行任务的深度,并设置阈值深度 threshold_depth=2*cut_off_depth ; (5)当前线程采用串行化执行策略执行并行任务编译指导语句,此时不生成并行任务; (6 )判断是否所有任务都已完成,若是则过程结束,否则转入步骤(7 ); (7)当前线程判断是否接收到并行任务编译指导语句,若接收到则转入步骤(8),否则返回步骤(5); (8)当前线程判断状态位flag是否为0,若是则转入步骤(9),否则表示存在有线程处于空闲状态且窃取不到并行任务,然后转入步骤(11); (9)当前线程判断其执行的并行任务的深度total_cbpth是否大于阈值深度threshold_depth,若大于则返回步骤(5),否则进入步骤(10); (10)当前线程判断其并行任务队列中的并行任务是否为空,或者所有线程的并行任务队列中的并行任务总数是否小于总线程数,如果是,则转入步骤(12),否则返回步骤(5);(11)当前线程设置threshold_depth=threshold_depth+cut_off_depth, fIag=O ; (12)当前线程采用帮助优先的执行策略执行并行任务编译指导语句,以生成新的并行任务; (13)当前线程在接收到并行任务编译指导语句时,判断其执行的并行任务的临时深度是否大于剪枝深度cut_off_depth,若是则返回步骤(5),否则返回步骤(12)。
【文档编号】G06F9/45GK103729241SQ201310680110
【公开日】2014年4月16日 申请日期:2013年12月12日 优先权日:2013年12月12日
【发明者】廖小飞, 金海 , 毕建民 申请人:华中科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1