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

文档序号:8258140阅读:来源:国知局
下界(lb)。例如,假设循环具有n次迭代,每次迭代在关联的关键区 域中具有c个周期,在非关键区域中具有nc个周期,并且t个线程执行并行循环。周期的 数量'c'代表在关键区域内花费的总时间(以机器周期测量),而周期的数量'nc'代表在 非关键区域中花费的总时间。周期的数量'X'代表事务内存进入和离开开销。周期的数量 'y'代表默认锁定开销(每一个关键区域)。
[0053] 使用描述的变量,在首次执行事务提升时获得方程1,其中在事务内执行循环的k 次迭代。具体地讲,通过提升处理,11*(〇+1+11〇)/1:变为11/^*((〇+11〇)*1^4!;)/1:。然后,将11/ k*((c+nc)*k+x)/t限制为小于n*(c+nc),n*(c+nc)是通过顺序执行而花费的时间;定义的 不等式条件由方程1表示。利用事务内存和k次迭代,称为方程1或下界EQ1的成本表达 式被定义为:11/1^((〇+11(3)纯+600)/1:个周期。在1^的这个值,其中1^>600/((〇+11(3)*(1:-1))。 下界识别事务内存情况的性能开始超过串行执行实例的点。
[0054] 方程2代表上界条件。通过将每个线程容量估计为M/T个字节,针对特定工作负 载中的唯一加载和存储操作的总数计算上界。高速缓存中的推测状态缓冲器被表示为M个 字节,并且硬件线程的总数被表示为T。每次推测加载或推测存储占用相应的高速缓存行, 因此,在(M/T)/高速缓存行(方程2)中将线程容量进一步除以高速缓存行的大小。
[0055] 源代码的简单编译包括将源代码翻译或变换为通常针对特定计算平台的可执行 形式。替代简单编译,优化变换可被用于在运行时为应用提供更好的总体性能。优化能够 使用各种变换以减少针对关键操作执行的指令的数量;重构产生的目标代码以最佳地利用 特定硬件架构;改进特定存储子系统的使用,并且利用架构处理大量的共享内存并行化的 能力。通常,与当使用简单编译进行编译时的情况相比,优化试图使应用运行得更快。
[0056] 编程模型(诸如,OpenMP)允许程序员编写高性能代码;然而,优化通常需要在运 行时性能、手编代码段和源代码的可移植性方面的折衷。例如,源代码的优化使用目标平台 的硬件事务内存能力执行高阶变换,以通过提升源代码来提供另外的循环优化从而当优化 可用时使用优化。这个例子可有助于处理大量的数字数据的科学应用。
[0057] 参照图4,提供根据本公开的一个实施例的源代码片段的文本表示。
[0058] 语句402代表与程序代码的非关键部分关联的一组语句。非关键代码段通常包括 用于使用线程私有变量的计算的语句。语句406代表0MP规范,其中parallel for是用于 创建parallel区域和工作共享for构造的组合形式构造。该语句指示希望使用OMP,0MP 是图3的编译器运行时线程库306内的例程。
[0059] 语句404代表与程序代码的关键部分关联的一组语句。关键代码区域通常包括用 于使用共享变量的计算的语句,共享变量可由多个线程更新并且因此必须受到保护。语句 408代表根据tm_atomic pragma规范的程序代码的关键区域的开始。
[0060] 参照图5,提供根据本公开的一个实施例的代表图3的代码版本控制优化系统的 处理的各阶段的源代码片段的文本表示。代码片段500代表从源代码到在使用公开的处理 的利用循环版本控制的事务内存提升之后的代码的三个基本阶段。在代码片段500的例子 中,NC1代表非关键区域1,NC2代表非关键区域2,并且C代表关键区域。
[0061] 代码部分502代表根据OpenMP标准的使用编程语言C的语法的程序的一部分,其 中如语句510#pragma omp parallel for中所指示,指定了 OpenMP并行函数的使用。虽 然记述了使用编程语言C的语法,但根据OpenMP标准,也存在使用编程语言Fortran的语 法的等同方案。在示例性语句中,parallel for部分是用于创建parallel (并行)区域和 工作共享for构造的组合形式构造。在类似例子中,程序开发者还能够指定语句#pragma parallel {#pragma for {}},这将是等同的。
[0062] 继续该例子,另外位于代码部分502中的语句508 (也在图4中被示出为语句408) 记述指示程序代码的关键区域的开始的pragma tm_atomic。pragma tm_atomic语句由图3 的增强编译器304翻译为对例程tm_begin()和tm_end()的调用,例程tm_begin()和 tm_end()分别负责进入和离开与各关键区域关联的推测子处理。
[0063] 响应于代码部分502的初始处理,由增强编译器对接收的该部分程序代码执行 概括操作以便能够在增强编译器运行时使用提供的线程库。这导致代码部分504中示出 的代码。概括处理还对循环进行变换以经由下界和上界参数取得运行时行程计数(trip count)。如前面一样,进入和离开tm例程被调用以包裹如代码部分504中所示概括的程序 代码中的关键区域。
[0064] 响应于概括代码部分502的程序代码,在代码部分506中指示该处理的下一个步 骤。代码部分506示出由当前上下文确定的在语句514、516和518中使用三个不同代码版 本之一的选择性优化。语句514、516和518中的每个代码版本提供分立的路径,其中提供 的两个代码版本采用事务内存使用的变型(如语句514和516中),而第三代码版本提供退 路以使用传统处理并且不使用事务内存(如语句518中)。
[0065] 在编译时期间,增强编译器产生代码部分506,例如具有版本控制条件的所有循环 版本。总是产生代码部分504以支持并行执行。在运行时期间,收集统计数据以改变参数 下界(lb)、上界(ub)、conflictHl、conflictH2,这些参数相应地改变代码执行的路径。这 些特定参数最初具有默认值,但可根据冲突的量而被改变。然而,不使用统计数据重新编译 代码(例如,仅在编译时期间产生代码一次并且以后在运行时期间改变代码)。
[0066] 语句514中的第一个if语句确定是否满足用于事务内存使用和关联的 conflictHl 520的阈值。当不满足第一个if语句的条件时,语句516(使用else if形式 的语句)中的第二个if确定是否满足用于事务内存使用和关联的conflicts 522的阈 值。当也不满足事务内存使用条件时,如语句518中所示使用利用基于传统锁的处理的程 序代码的版本。
[0067] 公开的处理的实施例还配备代码部分506的例程以经由统计数据收集器在运行 时搜集指示冲突的统计数据。响应于满足或超出预定阈值,给出与conflictHl 520或 conflictH2 522关联的标记。如代码部分506中所示,当conflictHl 520或conflictH2 522被设置为返回值TRUE时,有效地忽略各事务内存代码版本,由此默认为基于锁的关键 区域(代码部分506的最后的else语句518)。
[0068] 通过运行一个工作共享而得知的信息因此被用于引导是否应该针对下一个工作 共享再次使用事务内存。工作共享可位于程序代码的同一实例中,或者位于另一并行区域 中。因此,从第一区域获得的信息可被重新用在该区域的代码部分的下一次迭代中,或者被 应用于处理与第一区域相同的代码部分的实例的一个或多个其它区域。
[0069] 另外,当动态工作共享有效时,语句524中的下界(lb)和上界(ub)参数可被调整 以及使用许多线程以进一步提高进入利用代码的版本的事务内存的机会。
[0070] 因此,公开的处理的实施例提供结合动态自适应运行时自动调整或自调谐功能的 在编译时的静态分析和优化的能力,以根据当前上下文从可用的三个替代方案选择性地确 定使用哪个代码路径。公开的处理的实施例以包括成本分析的变换框架的形式提供将循环 的几次迭代捆绑在单个事务区域中的能力。
[0071] 变换建立在504中示出的OpenMP?基础设施(OpenMP提供可从OpenMP. org 获得的用于跨越多个平台的并行编程的应用编程接口(API)规范)的销售商特定实现方式 中的唯一概括和工作负载分块(chunking)机制上。本公开的例子中的实施例提供这样的 能力:通过将许多迭代捆绑在事务内存区域中来避免针对优化的循环的每次迭代引起每个 事务的进入和离开开销。实施例在评估期间使用成本分析,成本分析考虑冲突概率和推测 状态容量。
[0072] 公开的处理中的成本分析(例如,如使用方程1和方程2所定义)未明确地考虑冲 突概率。然而,存在隐含的直接关系,其中当捆绑在事务内存区域中的迭代的次数增加时, 会在该区域中出现更多可能的冲突。该关系是直观的,因为当捆绑在事务内存区域中的迭 代的次数增加时,预期更大的推测状态,因此,在事务内存区域内花费更长的时间。两种事 件都增加事务内存区域遭受冲突的可能性。conflictHl 520和conflicts 522参数基于 由统计数据分析器提供的事务内存区域所引起的实际冲突,接收运行时记录信息。因此,公 开的成本分析未在编译时期间估计conflictHl 520和conflicts 522,而是将各冲突值 的计算留给运行时调整器。conflictHl 520和conflicts 522的默认设置是假,以有利于 事务内存代码路径的使用,并且如果记录了太多冲突,则运行时调整器可基于运行时统计 数据将它们设置为真。
[0073] 成本分析因此接收输入信息(包括工作负载、冲突的量、传统锁开销、事务内存进 入和离开开销以及动态简报信息),以确定在运行时要执行的特定代码版本。使用OpenMP 基础设施的编译器特定实现方式实现事务内存提升变换,以将循环的几次迭代(也被称为 块大小)捆绑在一个事务区域中。
[0074] 相应地针对在假设使用OpenMP定义的静态工作共享的情况下利用运行时检查产 生的代码版本(包括基于锁的代码(传统代码)、基于事务内存的代码和具有事务内存提升 变换的基于事务内存的代码),创建不同代码版本。当动态调度有效时,OpenMP运行时基于 关于行程计数参数的动态简报信息执行自适应运行时优化。要注意的是,修改行程计数参 数lb、ub对捆绑在tm区域中的循环迭代的次数具有直接影响,如524中所示。
[0075] 因此,公开的处理的实施例包括一组操作,所述一组操作将已有概括机制用于 OpenMP并行循环,在概括代码中执行与并行循环关联的循环成本分析和利用合适的循环版 本控制的事务内存提升变换。
[0076] 参照图6,提供根据本公开的一个实施例的与使用图3的代码版本控制优化系统 关联的优化范围的方框图。优化范围600是用于从图5中描述的三个版本确定哪个特定代 码版本适用的值的范围的例子。
[0077] 为了准确地得出成本模型并且因此获得优化的成本602,根据周期的数量来刻画 循环或工作负载。假设大值的n (许多循环迭代)和非常低的冲突概率,执行图4的例子中 的代码所需的以
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1