一种前瞻多线程并行执行优化方法

文档序号:6599462阅读:211来源:国知局
专利名称:一种前瞻多线程并行执行优化方法
技术领域
本发明涉及计算机领域,具体地说是涉及一种前瞻多线程并行执行优化方法。
背景技术
随着计算机应用的不断深入,单片多核处理器(Chip Multi-Processors, CMP)技 术日益倍受关注。利用CMP技术提高系统性能的关键是充分发挥多个微处理器核心的并行 优势。串行程序虽易于设计和调试,却难以利用CMP技术的并行特性;并行程序虽然能更多 获益于CMP技术,但并行编程对程序员能力要求较高。对于复杂的并行编程语言,程序员更 愿意使用传统的串行程序,而且希望能尽可能地重用已开发出的软件。在这种情况下,串行 程序的并行化方法受到了广泛的重视。串行程序并行化是指在保证程序语义不变的条件下,将串行程序划分为若干 并行线程,利用并行线程来充分利用CMP技术并行的优点。前瞻多线程(Speculative Multithreading)是串行程序充分利用CMP技术的关键,当线程执行所需参数在编译阶段 不确定的情况下,通过数据预取、数据推测等方法消除线程间的依赖关系,创建出能够并行 执行的前瞻线程。通过线程前瞻执行和相应的前瞻失效处理机制可以去除线程间的假依 赖,发现并维护真依赖,降低线程之间的依赖程度,提高线程之间的并行度。线程间的写后读(Read After Write, RAW)数据依赖是指两个线程之间存在对某 个或某几个特定存储空间或变量的写后读依赖,即后面一个线程要读到前面一个线程所写 的数据。线程前瞻执行虽然能在某种程度上提高并行执行的效率,但是因为前瞻执行时, 带有写后读数据依赖的线程会导致线程重启,且重启的时间开销和资源开销很大,也就是 说,对于有的线程,顺序执行的效率会比在多个核上并行执行的效率更好。

发明内容
针对上述现有技术存在的不足,本发明的目的是提供一种前瞻多线程并行执行优 化方法。该方法能减少多线程执行时的写后读数据依赖性冲突和不必要的线程间延迟等 待,提高串行程序在多核处理器上的执行速度,提高处理器利用率。为达到上述目的,本发明的构思是利用生产者距离和消费者距离来量化两个有 依赖关系的线程之间的依赖程度,并根据依赖程度有选择性设计前瞻多线程并行执行模 式。根据上述构思,本发明采用下述技术方案一种前瞻多线程并行执行优化方法,其具体步骤如下(1)、对串行程序中覆盖率较高和并行效率较高的循环部分和子函数部分,将循环 部分和子函数部分相应的串行程序部分划分为一个个的线程;(2)、判断线程是否前瞻执行,对于前瞻执行的线程分析每一个线程和线程的直接 后续线程之间是否存在写后读数据依赖;
(3)、以设定的生产者距离R与消费者距离P的比值R/P判断并行线程之间的依赖 程度选择线程是否前瞻执行;(4)、线程前瞻执行完后验证前瞻执行结果。本发明的一种前瞻多线程并行执行优化方法与已有技术相比较,具有如下面显而 易见的突出实质性特点和显著有点该方法能有效地减少线程并行执行时的数据依赖冲突 和不必要的延迟等待;综合考虑了串行程序中并行效率较高的循环部分和子函数部分,能 够充分挖掘程序中的写后读数据依赖,充分利用线程级并行性,并通过线程间写后读数据 依赖量化,有选择地前瞻执行,能提高单线程序在多核处理器上的执行速度和处理器利用 率。


图1是本发明的一种前瞻多线程并行执行优化方法的流程图;图2是图1中所述的步骤(1)的流程图;图3是图1中所述的步骤(2)的流程图;图4是图1中所述的步骤(3)的流程图;图5是图1中所述的步骤⑷的流程图。
具体实施例方式本发明的一个优选实施例结合附图详述如下本实施例所述方案的应用环境是面向单片多核处理器的线程级并行执行环境,本 实施例不限定所述技术方案应用环境中多核处理器架构。下面结合说明书附图和具体实施方式
对本发明作进一步详细的说明。在单片多核处理器平台上,对串行程序,利用并行线程执行中若出现数据依赖后 重启,只影响程序执行的效率,不影响程序执行的结果的原理,针对串行程序中易于并行的 循环部分和子函数部分,设计并行线程执行模型,利用生产者距离和消费者距离来量化两 个有依赖关系的线程之间的依赖程度,并根据依赖程度有选择性设计前瞻多线程并行执行 模式。写某一存储空间或变量的线程称为生产者线程,读某一存储空间或变量的线程称 为消费者线程。对某一个特定的写后读数据,只有生产者线程完成其写操作之后,消费者线 程才可以执行相应的读操作。前瞻多线程在CMP上是同时执行的,为了保证多线程之间更 好地并行执行,最小可能地发生数据依赖性冲突,利用生产者距离和消费者距离来量化依 赖线程之间的数据依赖程度,以此来判断何时需要前瞻并行,何时不需要前瞻并行,有针对 性地前瞻并行执行串行程序,减少线程重新执行的几率,从而提高处理器的效率。如图1所示,本发明的一种前瞻多线程并行执行优化方法,其步骤如下(1)对串行程序中覆盖率较高和并行效率较高的循环部分和子函数部分,将循环 部分和子函数部分相应的串行程序部分划分为一个个的线程;(2)判断线程是否前瞻执行,对于前瞻执行的线程分析每一个线程和线程的直接 后续线程之间是否存在写后读数据依赖;(3)以设定的生产者距离R与消费者距离P的比值R/P量化线程和线程直接后续线程之间的数据依赖程度选择线程是否前瞻执行,依据不同的依赖程度采取不同执行模 式,以此尽可能减少线程并行执行带来的冲突和前瞻执行后重启;(4)线程前瞻执行完后验证前瞻执行结果。上述步骤(1)所述的针对串行程序中的循环部分和子函数设计并行执行模式,将 单线程程序划分为线程,如图2所示,其具体步骤如下(11)、设置前瞻缓冲区每相邻的两个处理器核之间设置一个前瞻缓冲区,用于缓 冲前瞻多线程执行时所需要的预取数据和有关前瞻多线程的执行状态和上下文语义的数 据,每个处理器核对应一个前瞻缓冲区,对于单片多核处理器,多个处理器核之间采用环状 相连;(12)、生成循环线程对串行程序中的循环部分,按照顺序语义将每一个循环部分 按照迭代步依次展开,其中每一个循环部分中的一次迭代步作为一个循环线程;(13)、生成子函数线程对串行程序中的子函数部分,按照顺序语义将每一个子函 数部分按照调用顺序依次,其中每一个子函数部分中的一个子函数调用作为一个子函数线 程;(14)、生成中间线程对串行程序中的非步骤202和步骤203所述的循环线程和子 函数线程的部分,按照顺序语义,每直接相邻的两个循环部分之间的部分或者每直接相邻 的两个子函数部分之间的部分或者直接相邻的循环部分与子函数部分之间的部分作为一 个中间线程。上述步骤(2)所述的判断线程是否前瞻执行,从串行程序的第二个线程开始到最 后一个线程为止,分析每一个线程的直接前驱线程和该线程之间是否存在写后读数据依 赖,如图3所示,其具体步骤如下(21)、对上述串行程序中的循环线程、子函数线程、中间线程按照顺序语义从一开 始逐一编号,记下最后一个线程的编号N,为每一个线程建立一个变量表,用于记录这个线 程中的每一个变量的读写情况,在变量表中设一个0-1系统变量Sys,初始值为0,表示该变 量表对应的线程和线程的直接后续线程之间不存在写后读数据依赖,从编号为二的线程开 始分析;(22)、判断所分析的线程的编号是否为N,若线程的编号为N,则转步骤3 ;否则转 步骤23 ;(23)、判断上述步骤(22)所述的线程是否属于前瞻执行,若上述步骤(22)所述的 线程不属于前瞻执行,则转步骤(26),若上述步骤(22)所述的线程属于前瞻执行,则转步 骤(24);(24)、将上述步骤(23)所述的线程前瞻执行所用到的预取数据和记录执行状态 和上下文语义的数据存放在处理这个线程的处理器核所对应的前瞻缓冲区中;(25)、分析上述步骤(23)所述的线程对应的直接前驱线程和该线程之间是否存 在对同一变量的写后读依赖,若该线程的变量表中有对一个变量M进行了读操作,且该线 程的直接前驱线程对同一个变量M进行了写操作,则确定线程和直接前驱线程之间有依赖 关系,并将该线程的变量表中的Sys设为1 ;(26)、分析上述步骤(22)所述的线程的直接后续线程。上述步骤(3)所述的以设定的生产者距离R与消费者距离P的比值R/P量化线程之间的依赖程度,以此判断即将运行的线程是否前瞻执行,如图4所示,其具体步骤如下(31)、判断即将运行的线程的编号是否为N,若即将运行的线程的编号为N,则转 步骤4;否则转步骤(32);(32)、判断上述步骤(31)所述的线程的变量表中Sys的值是否为1,若上述步骤 (31)所述的线程的变量表中Sys的值为1,则转步骤(33);否则转步骤(36);(33)、计算该线程的第一条语句到第一次读变量M的语句之间的语句数量,该语 句数量称为消费者距离,记为P ;(34)、计算该线程的直接前驱线程的第一条语句到最后一次写变量M的语句之间 的语句数量,该语句数量称为生产者距离,记为R ;(35)、以设定的生产者距离R与消费者距离P的比值R/P选择线程是否前瞻执行, 若R/P彡1时,则转步骤(36);若R/P彡2时,则转步骤(37);若1 < R/P < 2时,则转步骤 (38);(36)、该线程和该线程的直接前驱线程之间不会发生数据依赖冲突,该线程前瞻 执行,与直接前驱线程同时执行;(37)、该线程和该线程的直接前驱线程之间会发生数据依赖冲突,该线程等待该 线程的直接前驱线程执行完成之后再执行;(38)、该线程和该线程的直接前驱线程之间有可能会发生数据依赖冲突,该线程 随机性选择前瞻执行。上述步骤(4)所述的线程前瞻执行完后验证前瞻执行结果,如图5所示,其具体步 骤如下(41)、线程前瞻执行所需的真实数据是指线程正确执行时所需的数据,真实数据 是由顺序语义中位于线程前面的前驱线程计算出的供线程使用的数据,判断线程的真实数 据是否已经被计算出来,若线程的真实数据已经被计算出来,则转步骤(42),否则转步骤 (43);(42)、判断真实数据与预取数据是否一致直接将前瞻执行线程所需要的真实数 据与前瞻执行时的预取数据作比较,判断真实数据与预取数据是否一致,若真实数据与预 取数据不一致,则转步骤(44),否则转步骤(45);(43)、将上述步骤(41)所述的线程置于等待状态,直至真实数据计算完成,转步 骤(42);(44)利用真实的数据重新执行上述步骤(42)所述的线程,再转步骤(45);(45)、线程最终执行完毕;以上对本前瞻多线程并行执行优化方法,进行了详细的介绍。本发明结合说明书 附图和具体实施例进行的阐述只是用于帮助理解本发明的方法;同时,对于本领域的一般 技术人员,依据本发明的方法,在具体实施方式
和应用范围上均会有改变之处,因此本发明 的实施例不应理解为对本发明的限制。
权利要求
一种前瞻多线程并行执行优化方法,其特征在于,利用生产者距离和消费者距离来量化两个有依赖关系的线程之间的依赖程度,并根据依赖程度有选择性设计前瞻多线程并行执行模式,其具体步骤如下(1)、对串行程序中覆盖率较高和并行效率较高的循环部分和子函数部分,将循环部分和子函数部分相应的串行程序部分划分为一个个的线程;(2)、判断线程是否前瞻执行,对于前瞻执行的线程分析每一个线程和线程的直接前驱线程之间是否存在写后读数据依赖;(3)、以设定的生产者距离R与消费者距离P的比值R/P判断并行线程之间的依赖程度选择线程是否前瞻执行;(4)、线程前瞻执行完后验证前瞻执行结果。
2.根据权利要求1所述的一种前瞻多线程并行执行优化方法,其特征在于,上述步骤(1)所述的针对串行程序中的循环部分和子函数设计并行执行模式,将单线程程序划分为 线程,其具体步骤如下(11)、设置前瞻缓冲区每相邻的两个处理器核之间设置一个前瞻缓冲区,用于缓冲 前瞻多线程执行时所需要的预取数据和有关前瞻多线程的执行状态和上下文语义的数据, 每个处理器核对应一个前瞻缓冲区,对于单片多核处理器,多个处理器核之间采用环状相 连;(12)、生成循环线程对串行程序中的循环部分,按照顺序语义将每一个循环部分按照 迭代步依次展开,其中每一个循环部分中的一次迭代步作为一个循环线程;(13)、生成子函数线程对串行程序中的子函数部分,按照顺序语义将每一个子函数部 分按照调用顺序依次,其中每一个子函数部分中的一个子函数调用作为一个子函数线程;(14)、生成中间线程对串行程序中的非步骤202和步骤203所述的循环线程和子函数 线程的部分,按照顺序语义,每直接相邻的两个循环部分之间的部分或者每直接相邻的两 个子函数部分之间的部分或者直接相邻的循环部分与子函数部分之间的部分作为一个中 间线程。
3.根据权利要求2所述的一种前瞻多线程并行执行优化方法,其特征在于,上述步骤(2)所述的判断线程是否前瞻执行,从串行程序的第二个线程开始到最后一个线程为止,分 析每一个线程的直接前驱线程和该线程之间是否存在写后读数据依赖,其具体步骤如下(21)、对上述串行程序中的循环线程、子函数线程、中间线程按照顺序语义从一开始逐 一编号,记下最后一个线程的编号N,为每一个线程建立一个变量表,用于记录这个线程中 的每一个变量的读写情况,在变量表中设一个0-1系统变量Sys,初始值为0,表示该变量表 对应的线程和线程的直接后续线程之间不存在写后读数据依赖,从编号为二的线程开始分 析;(22)、判断所分析的线程的编号是否为N,若线程的编号为N,则转步骤3;否则转步骤23 ;(23)、判断上述步骤(22)所述的线程是否属于前瞻执行,若上述步骤(22)所述的线 程不属于前瞻执行,则转步骤(26),若上述步骤(22)所述的线程属于前瞻执行,则转步骤 (24);(24)、将上述步骤(23)所述的线程前瞻执行所用到的预取数据和记录执行状态和上下文语义的数据存放在处理这个线程的处理器核所对应的前瞻缓冲区中;(25)、分析上述步骤(23)所述的线程对应的直接前驱线程和该线程之间是否存在对 同一变量的写后读依赖,若该线程的变量表中有对一个变量M进行了读操作,且该线程的 直接前驱线程对同一个变量M进行了写操作,则确定线程和直接前驱线程之间有依赖关 系,并将该线程的变量表中的Sys设为1 ;(26)、分析上述步骤(23)所述的线程的直接后续线程。
4.根据权利要求3所述的一种前瞻多线程并行执行优化方法,其特征在于,上述步骤(3)所述的以设定的生产者距离R与消费者距离P的比值R/P量化线程之间的依赖程度,以 此判断即将运行的线程是否前瞻执行,其具体步骤如下(31)、判断即将运行的线程的编号是否为N,若即将运行的线程的编号为N,则转步骤 4 ;否则转步骤(32);(32)、判断上述步骤(31)所述的线程的变量表中Sys的值是否为1,若上述步骤(31) 所述的线程的变量表中Sys的值为1,则转步骤(33);否则转步骤(36);(33)、计算该线程的第一条语句到第一次读变量M的语句之间的语句数量,该语句数 量称为消费者距离,记为P;(34)、计算该线程的直接前驱线程的第一条语句到最后一次写变量M的语句之间的语 句数量,该语句数量称为生产者距离,记为R ;(35)、以设定的生产者距离R与消费者距离P的比值R/P选择线程是否前瞻执行,若 R/P彡1时,则转步骤(36);若R/P彡2时,则转步骤(37);若1 < R/P < 2时,则转步骤 (38);(36)、该线程和该线程的直接前驱线程之间不会发生数据依赖冲突,该线程前瞻执行, 与直接前驱线程同时执行;(37)、该线程和该线程的直接前驱线程之间会发生数据依赖冲突,该线程等待该线程 的直接前驱线程执行完成之后再执行;(38)、该线程和该线程的直接前驱线程之间有可能会发生数据依赖冲突,该线程随机 性选择前瞻执行。
5.根据权利要求4所述的一种前瞻多线程并行执行优化方法,其特征在于,上述步骤(4)所述的线程前瞻执行完后验证前瞻执行结果,其具体步骤如下(41)、线程前瞻执行所需的真实数据是指线程正确执行时所需的数据,真实数据是由 顺序语义中位于线程前面的前驱线程计算出的供线程使用的数据,判断线程的真实数据是 否已经被计算出来,若线程的真实数据已经被计算出来,则转步骤(42),否则转步骤(43);(42)、判断真实数据与预取数据是否一致直接将前瞻执行线程所需要的真实数据与 前瞻执行时的预取数据作比较,判断真实数据与预取数据是否一致,若真实数据与预取数 据不一致,则转步骤(44),否则转步骤(45);(43)、将上述步骤(41)所述的线程置于等待状态,直至真实数据计算完成,转步骤 (42);(44)利用真实的数据重新执行上述步骤(42)所述的线程,再转步骤(45);(45)、线程最终执行完毕。
全文摘要
本发明公开了一种前瞻多线程并行执行优化方法,其步骤如下(1)、将串行程序划分为一个个的线程;(2)、判断线程是否前瞻执行,对于前瞻执行的线程分析每一个线程和线程的直接前驱线程之间是否存在写后读数据依赖;(3)、以设定的生产者距离与消费者距离的比值选择线程是否前瞻执行;(4)、线程前瞻执行完后验证前瞻执行结果。该方法能减少线程并行执行时的数据依赖冲突和不必要的延迟等待;本发明综合考虑了串行程序中并行效率较高的循环部分和子函数部分,能够充分挖掘程序中的写后读数据依赖,充分利用线程级并行性,并通过量化线程间写后读数据依赖,有选择地前瞻执行,能提高串行程序在多核处理器上的执行速度和处理器利用率。
文档编号G06F9/38GK101807144SQ20101012662
公开日2010年8月18日 申请日期2010年3月17日 优先权日2010年3月17日
发明者刘清华, 吴悦, 徐磊, 杨洪斌 申请人:上海大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1