一种缺省的OpenMP调度策略的制作方法

文档序号:19878317发布日期:2020-02-08 06:40阅读:867来源:国知局
一种缺省的OpenMP调度策略的制作方法

本发明涉及多核处理器的openmp编程模型技术领域,尤其涉及一种缺省的openmp调度策略。



背景技术:

openmp是适合于共享存储体系结构的多处理器线程级并行编程规范,一般面向循环结构的并行化。在并行处理的过程中,调度策略直接影响着系统资源的利用率和并行效率,而负载均衡和调度开销是对openmp的调度策略进行评测两个最重要的方面。为了实现较好的负载平衡而取得最优的性能,就必须对循环进行调度与分块,保证每个处理器尽可能地处于忙碌状态,同时将调度开销、上下文切换开销和同步开销降到最低。

openmp标准支持静态调度、动态调度、指数调度和运行时调度四种调度方式。静态调度是指将循环迭代空间划分成相等大小的子块。当循环迭代次数不能整除线程数与子块大小的乘积时,尽可能地划分成相等大小的子块。动态调度也是将循环迭代空间划分为相等大小的子块,与静态调度不同,动态调度不是按顺序将各个子块分配到相应的处理器上,而是在程序执行过程中,某个处理器完成一个子块后,动态申请下一个子块并执行。指数调度是指将循环迭代空间划分为子块,块的大小与剩余未执行的迭代次数除以处理器个数的商成比例,并按动态调度的调度方法调度各个子块的执行。运行时调度是指在程序运行时,通过环境变量指定其余3种调度中的一种。

3种调度方式中,静态调度具有最小的调度开销,而动态调度具有最大的灵活性。指数调度可以视作二者在平衡调度开销和负载均衡上的折中,但是对于递减型循环,随着调度进行,单次循环迭代的工作量逐渐减小,若使用指数调度,则线程分配到的调度块也逐渐减小,两者之间的这种正相关关系将导致后面的线程分担的计算量急剧下降,从而造成严重的负载不均。

刘胜飞等人在“一种改进的openmp指导调度策略研究[j].计算机研究与发展,2010,47(4):687-694”提出一种将静态调度和指数调度相结合的调度方法,解决了指数调度在递减循环结构中由于开始循环块过大而可能导致的负载不均衡的问题。但是,该调度策略很难做到负载均衡的同时保证所有开销降到最低。



技术实现要素:

针对现有调度方案很难做到负载均衡的同时保证所有开销降到最低的问题,本发明提供一种缺省的openmp调度策略,将静态调度和动态调度相结合,对于没有指定调度方式的openmp程序,既能够在改善程序的负载均衡的同时有效降低调度导致的其他开销。

本发明提供一种缺省的openmp调度策略,包括:

将整个循环程序分为前半部分循环迭代和后半部分循环迭代;

针对前半部分循环迭代,采用预设的静态调度策略执行迭代;

针对后半部分循环迭代,采用预设的动态调度策略执行迭代。

进一步地,所述预设的静态调度策略具体为:

若省略调度参数k,则将迭代空间划分为基本相等的p个子块,令m=n1/p,n=n1%p,则所有处理器中,前n个处理器需要处理的块大小为m+1,后p-n个处理器需要处理的块大小为m;若未省略调度参数k,则将迭代空间划分为个块,当i<nc–1时,当i=nc–1时,

按块的序号将每个块映射到相应的处理器上,处理器执行迭代;

其中,n表示整个循环程序中总的循环迭代次数;n1表示前半部分循环的迭代次数;p表示运行时的线程或者处理器数目;nc表示迭代空间被划分的块数目;表示迭代空间被划分的块大小,i表示块的序号。

进一步地,所述预设的动态调度策略为:

若未省略调度参数k,将迭代空间划分为个子块,当i<nc–1时,当i=nc–1时,若省略调度参数k,则默认k=1,仍按照未省略调度参数k的迭代空间的划分方式进行划分;

处理器执行完当前子块后,动态申请执行下一个子块;

其中,n2表示后半部分循环的迭代次数;nc表示迭代空间被划分的块数目;表示迭代空间被划分的块大小,i表示块的序号。

本发明的有益效果:

本发明提供的一种缺省的openmp调度策略,依据静态调度策略的实现原理,静态调度有利于调度开销,能够尽可能地降低当多个处理器同时访问同一片存储区域时发生访存冲突的概率,提高cache的使用效率;依据动态调度策略的实现原理,能够较好的将大小不同的循环体均衡的分配到各个线程上去,因此能够获得较好的负载均衡性,同时,动态调度具有最大的灵活性,而且动态调度单次调度开销相对指导调度小,这在一定程度上也减少了调度开销。本发明通过前半部分循环迭代的静态调度策略,以获得相对于动态调度较小的调度开销的优势;通过后半部分循环迭代的动态调度策略,可以弥补静态调度策略不够灵活导致负载不均的缺点;因此,对于没有指定调度方式的openmp程序,本发明既能够在改善程序的负载均衡同时有效降低调度导致的其他开销,进一步改善openmp程序线程级并行性能,扩大了其适应性,对高性能计算程序自动并行领域的发展具有重要的现实意义。

附图说明

图1为本发明实施例提供的一种缺省的openmp调度策略的实现框架示意图;

图2为本发明实施例提供的一种缺省的openmp调度策略的流程示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

图1为本发明实施例提供的一种缺省的openmp调度策略的实现框架示意图。即在实施本发明提供的缺省的调度策略之前,需要对现有的编译器的数据结构和原有的动态调度策略的初始化函数进行修改,具体如下:

首先,预先在支持openmp规范提供的静态调度、动态调度、指数调度等调度策略的编译器(例如ompi编译器)中重新定义或者修改原有保存循环执行时状态的数据结构,添加布尔变量part_one和整型变量one_chunksize。其中,part_one为true表示当前迭代块属于前半部分循环迭代,采用静态调度,反之属于后半部分循环迭代,采用动态调度;one_chunksize表示前半部分采用静态调度时每个线程执行的迭代块大小,可以通过前半部分循环的迭代次数n1除以线程数p得到。

然后,在支持openmp规范提供的静态调度、动态调度、指数调度等调度策略的编译器(例如ompi编译器)中修改相应的动态调度策略的初始化函数,添加判断条件用来判断采用静态调度还是动态调度,初始化前半部分循环静态调度的迭代块大小(one_chunksize)等。

最后,在支持openmp规范提供的静态调度、动态调度、指数调度等调度策略的编译器(例如ompi编译器)中定义或者修改了数据结构,同时修改了相关的初始化函数之后,重新编译调试生成新的编译器,该新的编译器可执行如图2所示的缺省的调度策略。

如图2所示,本发明实施例提供一种缺省的openmp调度策略,包括以下步骤:

s201:将整个循环程序分为前半部分循环迭代和后半部分循环迭代;

s202:针对前半部分循环迭代,采用预设的静态调度策略执行迭代;针对后半部分循环迭代,采用预设的动态调度策略执行迭代。

因为在实际的科学计算程序中,一个大的计算循环往往是前面计算的数据比较小,后面计算的数据越来越大,这样就导致负载不均衡往往出现在循环迭代的后面,因此本发明实施例中,前半部分循环迭代采用静态调度策略而后半部分迭代采用动态调度策略。

本发明实施例提供的一种缺省的openmp调度策略,依据静态调度策略的实现原理,静态调度有利于调度开销,能够尽可能地降低当多个处理器同时访问同一片存储区域时发生访存冲突的概率,提高cache的使用效率;依据动态调度策略的实现原理,能够较好的将大小不同的循环体均衡的分配到各个线程上去,因此能够获得较好的负载均衡性,同时,动态调度具有最大的灵活性,而且动态调度单次调度开销相对指导调度小,这在一定程度上也减少了调度开销。本发明通过前半部分循环迭代的静态调度策略,以获得相对于动态调度较小的调度开销的优势;通过后半部分循环迭代的动态调度策略,可以弥补静态调度策略不够灵活导致负载不均的缺点;因此,对于没有指定调度方式的openmp程序,本发明既能够在改善程序的负载均衡同时有效降低调度导致的其他开销,进一步改善openmp程序线程级并行性能,扩大了其适应性,对高性能计算程序自动并行领域的发展具有重要的现实意义。

在上述实施例的基础上,本发明实施例提供一种具体的静态调度策略,具体为:

若省略调度参数k,则将循环空间划分为基本相等的p个块,令m=n1/p,n=n1%p,则所有处理器中,前n个处理器需要处理的块大小为m+1,后p-n个处理器需要处理的块大小为m;

若未省略调度参数k,则将循环迭代空间划分为个块,当i<nc–1时,当i=nc–1时,

其中,n表示整个循环程序中总的循环迭代次数;n1表示前半部分循环的迭代次数;p表示运行时的线程或者处理器数目;nc表示迭代空间被划分的块数目;表示迭代空间被划分的块大小,i表示块的序号。

具体地,按照是否省略调度参数k,本发明实施例提供的静态调度策略包括两种迭代空间划分方式,即两种计算迭代上下界的方式。静态调度的调度规则是将迭代空间划分为k大小的子块,并按次序将每个块映射到相应的处理器上执行。由于调度顺序确定,每个处理器可以在初始化的时候根据n1和p的值确定所有需要自己执行的迭代,当n1能被p整除时,最后一轮调度时没有处理器空闲;当n1整除p余1时,最后一轮调度只有1个处理器参与;当n1不能被p整除且余数大于1时,最后一轮调度有多个处理器参与,且有处理器空闲。

在上述各实施例的基础上,本发明实施例提供一种具体动态调度策略,具体为:

若未省略调度参数k,将迭代空间划分为个子块,当i<nc–1时,当i=nc–1时,若省略调度参数k,则默认k=1,仍按照未省略调度参数k的迭代空间的划分方式进行划分;

处理器执行完当前子块后,动态申请执行下一个子块;

其中,n2表示后半部分循环的迭代次数;nc表示迭代空间被划分的块数目;表示迭代空间被划分的块大小,i表示块的序号。

具体地,无论是否省略调度参数,本发明实施例提供的动态调度策略包括一种迭代空间的划分方式,只是在省略调度参数k时,默认k=1。

此外,动态调度过程中,最初可随机将子块分配到各处理器上;随后,各处理器执行完当前子块后动态申请下一子块。

需要说明的是,在最后一个子块执行完时,每个处理器还需要计算一次新的上下界并判断是否已经超出所需计算的迭代空间,若是,则表示此时调度过程完成。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1