首页> 中国专利> 基于CMP的推测多线程机制下的多推测路径线程划分方法

基于CMP的推测多线程机制下的多推测路径线程划分方法

摘要

本发明公开了一种基于CMP的推测多线程机制下的多推测路径线程划分方法,该方法线程划分是以过程为单位的,对每一个过程,划分时会限制线程结束点在过程的控制无关节点,限制线程激发点在过程的互斥路径段,以使得线程的激发受到更严格的限制;同时,对相互互斥的路径段上的激发点,让其对应到同一个线程结束点下,并在线程结束点后插入连续的多个预计算片段;预计算片段的内容随推测路径和激发点的变化而互异;模拟器在运行时执行不同的推测路径,会根据推测路径上对应的激发点选取对应的预计算片段进行执行。该方法能在多条路径上进行线程划分,从而增加了可推测并行执行的分支覆盖率。

著录项

  • 公开/公告号CN105138309A

    专利类型发明专利

  • 公开/公告日2015-12-09

    原文格式PDF

  • 申请/专利权人 西安交通大学;

    申请/专利号CN201510400552.6

  • 发明设计人 赵银亮;王启明;李美蓉;

    申请日2015-07-09

  • 分类号G06F9/38(20060101);

  • 代理机构61200 西安通大专利代理有限责任公司;

  • 代理人徐文权

  • 地址 710049 陕西省西安市咸宁西路28号

  • 入库时间 2023-12-18 12:45:22

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-06-24

    未缴年费专利权终止 IPC(主分类):G06F 9/38 专利号:ZL2015104005526 申请日:20150709 授权公告日:20180717

    专利权的终止

  • 2018-07-17

    授权

    授权

  • 2016-01-06

    实质审查的生效 IPC(主分类):G06F9/38 申请日:20150709

    实质审查的生效

  • 2015-12-09

    公开

    公开

说明书

技术领域

本发明属于计算机领域,涉及基于CMP的推测多线程技术,特别是涉及基于CMP的推测多 线程机制下的多推测路径线程划分方法。

背景技术

推测多线程(SpeculativeMultithreading,SpMT)是一种软硬件协同工作的程序自动并 行化技术,它能够提高通用串行程序在多核硬件上的执行效率。编译器对串行程序采用激进的 线程划分策略,并不完全保证各个线程之间独立,而是允许线程之间有一定的数据依赖和控制 依赖。在线程执行过程中由多核硬件检测线程运行状态,如检测到依赖违规,硬件则使程序自 动从错误中恢复,以此来保证程序的正确性。

线程之间的依赖通过值预测技术解决。通过编译技术分析得到当前线程的live_in数据, 然后分析线程发起点到当前线程开始执行点之间的代码片段,获取live_in变量的依赖指令 集。在当前线程被分配到新的核上执行时,先执行这部分依赖指令,以此对live_in变量的值 进行预测。这种先被执行的部分依赖指令,通常称为预计算片段(Pre-computationslice, P-slice)。包括预计算片段在内的值预测技术能够很大程度上解决线程间的依赖问题。

在推测多线程的技术中,线程推测是在某一条或几条分支路径上进行的,这些分支路径也 被称为推测路径。推测路径的选取过程包含了分支预测过程,其能直接影响程序的控制依赖, 以及间接地影响数据依赖。当选取的推测路径与程序的实际运行轨迹相同的时候,程序的控制 依赖被直接消除,而通过值预测技术提取的预计算片段此时能够较大概率地消除数据依赖,从 而总体上使得推测执行的正确性较大地得到提高。反之,如果选取的推测路径与程序的实际运 行轨迹出现较大的不一致,会造成程序由于控制依赖被直接撤销,或者降低了预计算片段提取 依赖指令的准确性,最终使得程序的推测执行被撤销。因此,推测路径的选取要尽量能预测到 程序执行的轨迹。

发明内容

本发明目的在于解决线程划分过程中由于多推测路径而导致的不同路径之间激发的线程 相互干扰而造成较大概率撤销的问题,提供一种基于CMP的推测多线程机制下的多推测路径线 程划分方法,以保证线程划分在多路径下进行时能够覆盖更多的分支,获得更高的推测并行性, 同时减少由于值预测失败而造成的撤销。

本发明通过以下技术方案来实现:

一种基于CMP的推测多线程机制下的多推测路径线程划分方法,对于串行程序进行线程 划分的方法,其步骤如下:

1)编译器会在对串行程序进行线程划分之前依据程序剖析器剖析运行的结果寻找执行概 率大于阈值branch_probability∈[0.10,0.25]的路径作为推测路径,只在选取的推 测路径上进行线程划分,推测路径是一条或者多条;

2)将串行程序的过程体的控制流图切分成线程体粒度大于阈值 thread_size_lower∈[15,25]的控制流图子图,子图的切分点作为由控制子图生成的 线程单元的结束点;在线程的结束点插入CQIP指令,其表示当前线程单元的执行结束;

3)在推测路径的互斥子路径段,寻找能使线程之间的数据依赖数目小于阈值 dependence_threshold∈[2,5],而线程激发距离大于阈值 spawning_distance_lower∈[3,8]的位置作为新线程激发点,在此激发新的线程单元 执行,激发距离表示候选的线程激发点与线程结束点之间的距离;在线程激发点插入 线程激发控制指令SPAWN指令,控制线程的激发;SPAWN指令格式为SPAWNaddr,addr 表示新线程的指令起始地址;

4)在每一个待激发的新线程单元的开始部分插入预计算片段,每一段预计算片段与一个 (SPAWN,CQIP)指令对对应。

切分控制流图成为控制子图的切分点满足如下语义:

切分点属于过程的控制无关基本块,即从过程的入口节点到过程的出口节点的任何路径都 经过该基本块;通过切分点的切分,使控制流图子图的粒度大于thread_size_lower,而对其 粒度上限不作直接约束。

SPAWN指令必须插入在互斥子路径段上,互斥子路径段的语义如下:

1)互斥子路径段是相邻两个CQIP指令之间的控制流图子图的边的集合的子集,即该路径 段包含的指令集合,不跨越多个线程体,只在一个线程体内部;

2)一条路径上的属于互斥子路径段的部分与该控制子图其他路径无任何交集。

一段预计算片段由PSLICE_ENTRY指令标记起始,由PSLICE_EXIT指令标记结束; PSLICE_ENTRY指令的地址与激发运行该线程的SPAWN指令的addr值相等。

每一段互斥路径子段上的SPAWN指令,在激发新线程之前,对应有一段预计算片段,该预 计算片段是对应互斥子路径段上的SPAWN指令到CQIP指令之间的指令集合的精简集;具体地, 其预计算片段为当前线程在SPAWN指令到CQIP指令之间的livein变量的定义指令组成的指令 集合。

相互互斥的多个互斥子路径段上的SPAWN指令对应的预计算片段都被放置在同一个CQIP 指令的后面,每一个SPAWN指令的addr值与其中一段预计算片段的PSLICE_ENTRY指令地址相 等。

模拟器端在执行时,互斥路径子段上的SPAWN指令能根据addr值跳转到对应的 PSLICE_ENTRY指令开始执行一段预计算片段,并且执行完这段预计算片段后,由模拟器的硬 件检测后续指令是否是PSLICE_ENTRY指令,若是,则继续跳过其后的预计算片段,若不是, 则表示开始执行常规的线程体内容。

与现有技术相比,本发明具有以下有益的技术效果:

本发明通过对过程体提取多条路径,在多路径上进行线程划分,允许线程执行单元在多个 路径上推测执行,扩大了线程可以推测执行的分支覆盖率,从而能更多地挖掘程序的潜在并行 性。

当在多条路径上进行线程划分时,本发明使用的激发策略要求激发控制指令SPAWN指令必 须处于互斥的路径子段,从而在模拟器运行期,能够严格保证只有程序的执行轨迹覆盖对应的 互斥路径子段的时候,才会执行被插入的SPAWN指令,激发产生新的线程。这种对线程激发的 严格控制,能够避免在过程的多条路径都被划分的情况下,线程体被过多的激发,然后又被过 多的撤销,从而能够整体上降低线程的撤销率。

本发明采用的多预计算片段技术,使得模拟器在执行时能够根据执行的子分支动态地选择 与该子分支对应的预计算片段。由于在编译器端对于多条子路径进行线程划分时,对其中每一 条互斥路径段的子分支都相应地插入了SPAWN指令,并且对于每一个(SPAWN,CQIP)指令都在对 应的CQIP指令后插入了一段预计算片段,因此对于相互互斥的多个子分支,其在对应的CQIP 指令下被插入了多个预计算片段,每一段预计算片段与一个互斥子分支对应。因此当模拟器在 执行的时候,当其执行到互斥子分支中的一条时,其会执行其上的SPAWN指令。该SPAWN指令 能够激发新的线程的时候,会选择对应的预计算片段,会在新线程体的常规内容的开始部分执 行之前先执行这段预计算片段。由于同一CQIP指令下可能同时存在多段预计算片段,新线程 的执行单元能够根据SPAWN指令”跳转”到特定的预计算片段,并且只执行该段预计算片段。 新线程的执行单元会跳过该该预计算片段之前和之后的其他预计算片段。通过在编译器生成多 个预计算片段而在执行期由模拟器根据执行路径选择相应的预计算片段,能够提高预计算片段 与实际执行的分支对应,提高预计算片段计算的准确性。

附图说明

图1为基于CMP的推测多线程机制下线程划分所涉及的模块和组件图;

图2为切分控制流图为控制子图并寻找线程结束点位置的流程图;

图3为寻找过程的互斥路径子段示意图;

图(a)表示的是一个线程块的控制流图;

图(b)表示的分支块节点(branchblock)构成的树,

图(c)和图(d)是图(a)表示的控制流图的推测路径。

图4为多分支下相互互斥的子路径对应的多预计算片段关系图;

图(a)是编译时的预计算片段放置图;

图(b)描述的是图(a)所示的子程序在运行时对应的程序地址示意图。

具体实施方式

下面结合附图对本发明作进一步详细说明。所述是对本发明的解释而不是限定。

参见图1,所示的推测多线程系统主要由编译器和模拟器两部分组成。其中,编译器部分 包含了程序剖析器,线程划分器两部分。程序剖析器的作用是剖析试运行待处理的源程序,提 取与输入程序相关的统计信息,如分支概率,循环体和过程动态指令数,并将该统计信息以注 释的形式添加到相应的指令中。线程剖析器包含路径选取模块,控制子图切分模块,激发位置 选取模块和预计算片段生成模块,其中路径选取模块的作用是对过程体提取出若干路径作为推 测路径,使得线程划分在推测路径上进行,以降低线程划分的整体复杂度。

模拟器负责对程序的推测模拟执行。其在执行中如果执行到SPAWN指令,则会激发一个新 的线程在空的核或者串行执行顺序的优先级较低的核上运行,当执行到CQIP指令的时候,结 束当前线程单元的运行。为了使得线程之间的推测运行不因为线程之间的依赖而被过多的撤 销,在模拟器运行新的线程单元的时候,会先运行一段由PSLICE_ENTRY和PSLICE_EXIT指令 包围的预计算片段。通过引入预计算片段来消减线程间的数据依赖。

基于CMP的推测多线程机制下的多推测路径线程划分方法,包括以下步骤:

1)编译器会在线程划分之前寻找多条推测路径,在推测路径上进行线程划分;

2)将过程体的控制流图切分成大小在限定阈值thread_size_lower之上的控制流图子图, 每一个控制流图子图称为一个线程块,以线程结束指令CQIP指令作为控制流图子图的切分点, 插入CQIP指令;

3)在推测路径上寻找互斥子路径段,在推测路径的互斥子路径段插入线程激发控制指令 SPAWN指令;

4)对于相互互斥的互斥子路径段上的SPAWN指令,将其对应到同一个CQIP指令,使在不 同路径上执行时激发的新线程具有相同的常规线程体内容;

5)在每一个待激发的新线程单元的开始部分插入预计算片段,每一段预计算片段与一个 (SPAWN,CQIP)指令对相对应,预计算片段的内容为SPAWN指令到CQIP指令之间包含的指令的 精简集合。如果是多个相互互斥子路径上的SPAWN指令对应同一个CQIP指令,则对每一个 (SPAWN,CQIP)指令对插入一段预计算片段,形成顺序叠加在一起的多段预计算片段;

在模拟器端,当模拟器执行到SPAWN指令,则会激发一个新的线程在空闲的核上运行,当 执行到CQIP指令的时候,结束当前线程单元的运行。SPAWN指令的格式为SPAWNaddr,addr 代表新线程使用的预计算片段的起始地址,也即是PSLICE_ENTRY的地址。新的线程在开始运 行之前,会先运行指令起始地址为addr的一段预计算片段。

将过程体的控制流图切分成由CQIP指令分隔开的控制子图,进而形成线程块的过程如图2 所示,有以下步骤:

1)计算该过程体的大小,即该过程体包含的指令数目,判断其值是否小于两倍的表示线 程体大小的阈值下限lower_thread_size阈值,如果小于2*lower_thread_size,则表明该过 程体过小,不适合划分,否则进行后续操作;

2)将当前待处理的线程块记为possible_thread,其内容为包含的超级块列表集合,将 possible_thread初始化为空;余下子图表示的线程块记为future_thread,其包含的内容也 是超级块列表集合,将其初始化为过程的最可能路径most_likely_path包含的所有的超级块 的列表;将可以插入CQIP指令的超级块列表记为cqip_block_list,也初始化为空;

3)将curr_block指针指向most_likely_path的第一个超级块;

4)判断curr_block是否是most_likely_path的最后一个超级块,如果是,则停止继续 对余下子图插入CQIP指令,否则的话,判断余下子图future_thread的大小是否小于阈值 lower_thread_size,如果是也停止插入CQIP指令的过程;

5)如果possible_thread小于lower_thread_size,则将操作跳转到步骤2),否则,将 curr_block追加到possible_thread,并判断curr_block是否是属于过程的支配路径(控制无 关节点构成的路径)。若curr_block不属于支配路径,则遍历most_likely_path,将其加入 到possible_thread直到curr_block是过程的支配节点进行步骤4);

6)若curr_block是过程的支配节点,并且future_thread的大小不小于 lower_thread_size则将当前curr_block加入到cqip_block_list中,curr_block指向下一 个超级块,继续步骤4),否则算法结束,对该过程插入CQIP指令完成。

经过上述过程,cqip_block_list存储的是适合插入CQIP指令的超级块列表。遍历该列表, 对其中的每一个超级块的第一个基本块,寻找其第一个非标签指令的位置,该位置即为适合插 入CQIP指令的线程技术点位置。在切分控制流程,确定线程块大小的时候,使用了三个准则:

1)线程块大小必须大于允许的线程块的最小阈值lower_thread_size;

2)线程块的开始超级块,也即是能插入CQIP点所在的超级块,必须是过程的非控制相关 节点;

3)如果当前的线程块(possible_thread)过大,导致余下的子图构成的后继线程块 (future_thread)过小,则禁止对当前线程块和其后继线程块进行切分,将二者作为一个线程块;

在推测路径上寻找互斥子路径段以找到适合插入SPAWN指令的过程如下,如图3所示。

在图3中,(a)表示的是一个线程块的控制流图,(b)表示的分支块节点(branchblock)构成 的树,(c)和(d)是(a)表示的控制流图的推测路径。图中的节点是超级块节点。图中阴影部分 标识的是两分支跳转概率之差的较小的分支节点。为了定位新线程激发点的可选位置集合,需 要将这些分支节点按照在SCFG中的节点关系构成一棵分支节点树。对于待划分推测路径, 使用分支节点树来寻找激发点在该推测路径中的合适的插入位置范围,找到推测路径中的节点 在该树中的最低层的匹配节点,设其为match_block,则SPAWN指令适合插入的SP点的范围 结合为(match_block,pdom(match_block)),不包括两端点。(a)对应的分支节点树如图3(b)所示。 如给定图3(c)所示的一条推测路径{0,1,3,6,11,12,16,17,18,19},则该推测路径在分支节点 树中的匹配节点为11,匹配节点的直接逆向支配节点为17。因此,(c)中可以作为线程激发点 的节点集合为阴影部分表示的部分,即节点12和节点16。类似的(d)中的激发点可选位置集合 为节点4,节点8和节点14。

阴影部分的表示的节点集合,都在对应的子路径上。在执行时只有当程序执行在特定的推 测路径上时执行轨迹才会覆盖阴影部分,因此不会造成不同推测路径上的SPAWN指令在运行 时相互干扰产生影响的情况。

当有多个互斥子路径产生时,如果在多个相互互斥的子路径上插入SPAWN指令,这时需 要将多个预计算片段与同一个CQIP指令和多个SPAWN指令相对应。

在多路径下,一条CQIP指令可能会同时与多条SPAWN指令对应,并且SPAWN指令处 于不同的路径上。当提取预计算片段的时候,由于预计算片段主要是SPAWN指令到CQIP指 令之间的指令集的子集,因此需要产生多个预计算片段,每个预计算片段对应一个(SPAWN, CQIP)指令对。

多个预计算片段的放置是顺序放置在一起的,且第一段预计算片段放置在CQIP指令的下 一个指令位置。由于存在多个预计算片段,需要对每一段放置一个对应的标签,以使得SPAWN 指令能直接跳转到该标签上。

如图4所示。(a)是编译时的预计算片段放置图,(b)描述的是(a)图所示的子程序在运行时 对应的程序地址示意图。

图4中所示的两条SPAWN指令分别位于两个分支上。其中0号节点的左分支里的SPAWN 指令的跳转标签被设置成L1;0号节点的右分支里的SPAWN指令的跳转标签为L2。当程序 执行时,如果执行轨迹覆盖左分支,则激发的新线程从L1标签开始执行,即新线程的第一条 指令为PSLICE_ENTRYL1;相应地,如果程序的执行轨迹覆盖右分支,则新线程从L2标签 开始执行,执行的是第二段预计算片段。在上述情况下,不管程序执行的是哪条分支,当前线 程单元的结束标志始终是L1标签前的CQIP指令。图4(b)描述的是(a)图在运行的可能对应的 程序地址。图4(b)表明在执行时,SPAWN指令能够使新的线程准确地跳转到各自的预计算开 始位置开始执行。

图4所示的多预计算片段实现当执行的分支为左分支的时候,新的线程从L1标签开始执 行。由于L1标签下还有第二段预计算片段,因此会导致新的线程执行两段预计算片段,这时 必须使新的线程跳过第二段预计算片段。可以使用硬件检测来判断对应的指令,以跳过其他的 预计算片段。当执行PSLICE_EXIT指令的时候,预读取下一条指令,检测其是否 PSLICE_ENTRY指令。如果下一条指令是PSLICE_ENTRY则说明下一段指令是另一个预计算 片段,跳过这段指令直到遇到该段指令的PSLICE_EXIT指令;如果不是则说明下一段是非预 计算部分,因此继续执行后续指令,即开始执行新线程的常规线程体内容。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号