用于实现事务内存区域提升的代码版本控制的方法和设备的制造方法_4

文档序号:8258140阅读:来源:国知局
机器周期表示的时间如下:
[0078] 当使用事务内存将具有受保护的关键区域的循环并行化时:n*(c+x+nc)/t个周 期;
[0079] 当使用全局锁定将具有受保护的关键部分的循环并行化时:
[0080] n*(c+y),对于nc〈 = (c+y)*(t_l)对于非工作负载主导情况,或者
[0081] n*(c+y+nc)/t,对于nc>(c+y)*(t_l)对于工作负载主导情况;
[0082](当一个线程的nc工作超过阈值时,能够直观地理解从非工作负载主导情况到工 作负载主导情况的切换,并且能够与((c+y)* (系统中的其它线程的其余部分))交叠,并且 因此被表示为(c+y)*(t_l))
[0083] 当在单个核上使用单个线程顺序地执行时:n*(c+nc)
[0084] 在当前上下文中假设大值的n意味着并行线程产生开销能够被忽略。如果n太小, 则执行循环所花费的时间由0MP运行时开销(例如,线程产生、同步)主导。非常低的冲突 概率被定义为这样的情况:事务内存区域不太经常回滚或者根本不回滚,因为回滚增加用 于重新执行该区域的额外时间。公开的建模在这些假设下保持有效。
[0085] 为了进一步阐明上界ub的约束,在运行时控制上界EQ2 606和下界EQ1 604中的 下界lb参数。使用0MP,用户能够指定使用的线程的数量。在执行期间适用于线程的上界 和下界(ub,lb)(例如,块大小)取决于队中(协作)的线程的数量,或者如另外所述的调 度。
[0086] 继续前一例子,假设进入开销和离开开销x的值是600个周期,并且事务区域的全 局锁定开销y的值是200个周期。通过使用已知设备执行测量,可使用近似得出这些值。例 如,记录在tm区域开始或锁定之前(当关键区域为空时)的时基寄存器值,然后在事务内 存区域结束或解锁之后再次记录该时基寄存器。然后获得这两次操作之间的记录值之差。
[0087] 具有简化方程1的形式的下界EQ1 604可随后被表示为k>60(V(c+nc)。用 于TM提升的阈值将因此是表示为if ((ub-lb)>60(V(c+nc)&&(ub-lb)*(内部的 loads+stores)〈2048)的条件。值600和2048取决于特定硬件系统。在使用的例子中,代 表BlueGene Q系统的测量的600个周期被用作例子以示出本公开的概念(可从国际商用 机器公司购得的超级计算机,参见:http://en. wikipedia. org/wiki/Blue_Gene)。
[0088] 另外,当nc的值几乎为零(暗示不存在非关键代码的情况、或非关键代码花费非 常少的时间的情况(例如,当仅递增共享变量(例如,a+ = 1,其中a是共享变量)时)之 一)并且c的值是20个周期时,将会需要利用事务内存的31个线程与单个线程的性能相 当。当c+nc的值大于600(前面提及的进入开销和离开开销的值)时,利用事务内存的2 个线程开始超过串行执行(单线程实例)。
[0089] 当事务内存区域被人为地增加到例如捆绑在单个事务中的循环的k次迭代的值 (块大小)时,事务内存情况变得更加吸引人使用。利用事务内存和k次迭代,成本表达式 变为:11/1^((〇+11(3)纯+600)/1:个周期。在1^的这个值,其中1^>600/((〇+11(3)*(1:-1)),被称为 方程1或下界EQ1 604,事务内存情况的性能开始超过串行执行实例。两个事务内存线程因 此在k>600/(c+nc)开始超过单个线程。
[0090] 响应于获得对要被捆绑在单个事务中的循环的迭代的估计,公开的处理的实施例 的成本模型开始确保不发生容量溢出。应用保守估计,保守估计取决于机器并且应该使用 目标实现方式的特定硬件平台以合适的机器参数替换保守估计。假设高速缓存中的推测状 态缓冲器具有M字节的大小并且硬件线程的总数为T,则每个线程被估计为具有M/T字节 的容量。进行进一步的假设:每个推测加载或每个推测存储将占用相应的高速缓存行。因 此,将各线程容量(M/T)除以表示为(M/T)/高速缓存行并且被称为方程2或上界EQ2 606 的高速缓存行的大小。
[0091] 方程2被用作针对各工作负载中的唯一加载和存储的总数的上界。使用Blue Gene/Q作为例子,具有实现在L2高速缓存中的大约16M大小的推测缓冲器、每节点64个硬 件线程和128字节L2高速缓存行大小,上限将会被估计为:2048次加载或存储。(16M/64 除以128得出2048,如方程2中所示)
[0092] 假设静态工作共享,方程1和方程2因此被用于得出用于确定事务内存使用的代 码版本的使用的阈值和用于确定利用循环版本控制的事务内存提升的代码版本的使用的 阈值,如图5中所示。能够容易地对循环内的加载和存储的次数进行计数,并且将该计数乘 以通过方程1计算的k。当所获得的值超过从方程2计算的值时,需要使k变得更小。约束 公式因此被表示为:(单次循环迭代中的加载+存储的次数)*(从方程1计算的k)〈方程 2。根据图5的代码部分506,下界lb和上界ub在运行时被传递给outlined_func。ub-lb 因此是如前所述的k的值。因此通过将k的值插入到刚刚描述的约束公式中来计算用于TM 提升的阈值。当满足在约束中表示的条件时,指令进入到在相应if条件中定义的代码段 (图5的三个代码版本之一)。
[0093] 参照图7,提供根据本公开的一个实施例的使用图3的代码版本控制优化系统的 编译时处理的流程图。处理700是使用图3的代码版本控制优化系统300的处理的例子。
[0094] 处理700开始(步骤702),并且接收一部分候选源代码(步骤704)。候选源包含 可进行并行处理的程序的程序源代码语句。
[0095] 处理700概括接收的该部分候选源代码(步骤706)。概括器操作通常从被称为主 机或初始函数的指定函数提取代码段(一个或多个连续的程序代码语句),由此创建新函 数。新函数被称为概括函数。概括操作以对新创建的概括函数的调用替换原始代码段。使 用该技术以便能够实现概括函数的并行执行。在公开的处理中,包裹关键代码区域的进入 和离开例程是tm_begin/tm_end例程,tm_begin/tm_end例程分别开始和结束推测子处理。 在当前情况下,对OpenMP并行循环执行概括。
[0096] 处理700提供逻辑流程。添加用于实现在运行时的冲突统计数据的搜集的进入和 离开例程(步骤708)。分析在运行时获得的冲突统计数据以帮助与版本控制条件关联的上 界参数和下界参数的调整,或者设置conflictHl、conflicts参数。在根据周期的数量刻 画循环/工作负载之后,定义循环成本。周期值是依赖于使用的基础硬件平台的依赖于机 器的值。
[0097] 执行使用事务内存提升的具有关键区域的并行化循环所花费的时间使用被定义 为n*(c+X+nc)/t个机器周期的成本表达式。执行使用默认全局锁定的具有关键区域的并 行化循环所花费的时间使用如下定义的成本表达式:n*(c+y),对于nc〈= (c+y)*(t_l);以 及n*(c+y+nc)/t,对于nc>(c+y)*(t-l),对于工作负载主导情况。在单个核上在没有任何 并行化的情况下使用单个线程顺序地执行循环使用如下定义的成本表达式 :n*(c+nc)。
[0098] 处理700产生包括多个循环版本的概括代码部分(步骤710)。所述多个循环版本 被包含在具有由关键区域进入和离开例程包裹的关键区域的候选源代码的概括表示中。所 述多个循环版本代表使用事务内存将具有关键区域的循环并行化的版本、使用全局锁定将 具有关键区域的循环并行化的版本、和在单个核上使用单个线程使用顺序执行的版本。其 后,处理700结束(步骤712)。
[0099] 参照图8,提供根据本公开的一个实施例的使用图3的代码版本控制优化系统的 运行时处理的流程图。处理800是使用图3的代码版本控制优化系统300的实施例和来自 图7的处理700的中间结果的运行时处理的例子。
[0100] 处理800开始,并且执行概括和配备的多个循环版本代码部分(步骤804)。所述 多个循环版本包括先前产生的版本:特定于使用事务内存将具有关键区域的循环并行化的 版本、为了使用全局锁定将具有关键区域的循环并行化而创建的版本、和在单个核上使用 单个线程使用顺序执行的版本。
[0101] 在执行期间,设备在运行时搜集冲突统计数据,冲突统计数据被分析以确定是否 应该改变利用与第一版本控制条件关联的冲突参数的用于事务内存提升的预定阈值(步 骤806)(例如,通过将conflictHl设置为真)。响应于确定不满足利用第一冲突的用于事 务内存提升的所述预定阈值,处理800选择和使用事务内存提升方案(步骤808),之后结束 (步骤816)。在本公开的上下文中的事务内存提升是指从正在处理的循环的内部到正在处 理的循环的外部的事务内存编译指示(或区域)的提升。
[0102] 响应于确定满足利用与第一版本控制条件关联的冲突参数的用于事务内存提升 的所述预定阈值,处理800确定是否满足利用与第二版本控制条件关联的第二冲突参数的 用于事务内存提升的预定阈值(步骤810)。响应于确定不满足利用与第二版本控制条件 关联的第二冲突参数的用于事务内存的所述预定阈值,处理800选择和使用事务内存方案 (步骤812),之后结束(步骤816)。响应于确定满足利用与第二版本控制条件关联的第二 冲突参数的用于事务内存的所述预定阈值,处理800使用默认的基于锁的方案(步骤814), 之后结束(步骤816)。
[0103] 因此,在说明性实施例中,提供了一种用于实现事务内存区域提升的代码版本控 制的计算机实现的处理,所述计算机实现的处理接收一部分候选源代码并且概括接收的该 部分候选源代码以用于并行执行。所述计算机实现的处理利用进入和离开例程包裹关键区 域以进入推测子处理,并且同时,在运行时搜集冲突统计数据。所述计算机实现的处理产生 包括多个循环版本的概括代码部分。利用运行时统计数据执行概括代码部分;并且根据在 运行时搜集的冲突统计数据确定执行多个循环版本中的哪一个。
[0104] 在一个实施例中,一种用于实现事务内存区域提升的代码版本控制的计算机实现 的处理通过根据机器周期的数量刻画循环或工作负载来估计要被捆绑在单个事务中的循 环的迭代次数k,其中周期的数量取决于机器,并且所述刻画假设循环具有n次迭代,每次 迭代在关键部分中具有c个周期,在非关键部分中具有nc个周期,并且存在用于执行并行 循环的t个线程,并且其中n较大并且冲突概率低,需要多个机器周期以执行循环,假设 x个周期的事务区域进入和离开开销以及y个周期的全局锁定开销(在表达式中表示为 n* (c+x+nc)/t个周期),全局锁定开销减少为表达式k>x/ ((c+nc) * (t-1))(方程1)。在首 次执行事务提升时得出方程1,其中在事务内执行循环的k次迭代。具体地讲,通过提升处 理,n*(c+x+nc)/t
当前第4页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1