具体实施方式
虽然以下提供一个或多个实施例的说明性实现方式,但可使用任何数量的技术实现公开的系统和/或方法。本公开绝不应该局限于以下示出的说明性实现方式、附图和技术(包括这里示出和描述的示例性设计和实现方式),而是可在所附权利要求的范围以及它们的等同物的全部范围内被修改。
本领域技术人员将会理解,本公开的各方面可被实现为系统、方法或计算机程序产品。因此,本公开的各方面可采用通常全部可在这里称为“电路”、“模块”或“系统”的完全硬件实施例、完全软件实施例(包括固件、常驻软件、微码等)或组合软件和硬件方面的实施例的形式。另外,本发明的各方面可采用实现于包含计算机可读程序代码的一个或多个计算机可读介质的计算机程序产品的形式。
可使用一个或多个计算机可读数据存储装置的任何组合。计算机可读数据存储装置可以是例如但不限于电子、磁、光学或半导体系统、设备或装置或者前述各项的任何合适的组合,但不包括传播介质。计算机可读数据存储装置的更具体的例子(非穷举列表)将包括下述各项:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或闪存)、便携式压缩盘只读存储器(CDROM)、光学存储装置或磁存储装置或前述各项的任何合适的组合,但不包括传播介质。在本文档的上下文中,计算机可读数据存储装置可以是能够存储由指令执行系统、设备或装置使用或结合指令执行系统、设备或装置使用的程序的任何有形装置。
可按照一种或多种编程语言的任何组合编写用于执行本公开的各方面的操作的计算机程序代码,所述编程语言包括:面向对象的编程语言,诸如Smalltalk、C++等;和常规过程化编程语言,诸如“C”编程语言或类似编程语言。Java和所有的基于Java的商标和标识是Oracle公司和/或它的分公司在美国、其它国家或二者的商标。程序代码可完全在用户的计算机上执行、部分在用户的计算机上执行、作为独立软件包执行、部分在用户的计算机上并且部分在远程计算机上执行或者完全在远程计算机或服务器上执行。在后一情形中,远程计算机可通过包括局域网(LAN)或广域网(WAN)的任何类型的网络连接到用户的计算机,或者可(例如,使用互联网服务提供商通过互联网)连接到外部计算机。
以下参照根据本发明的实施例的方法、设备、(系统)和计算机程序产品的流程图和/或方框图描述本公开的各方面。将会理解,流程图和/或方框图的每个方框以及流程图和/或方框图中的方框的组合能够由计算机程序指令实现。
这些计算机程序指令可被提供给通用计算机、专用计算机或其它可编程数据处理设备的处理器,以产生一机器,从而经计算机或其它可编程数据处理设备的处理器执行的指令产生用于实现流程图和/或方框图的一个或多个方框中规定的功能/动作的装置。
这些计算机程序指令也可被存储在计算机可读数据存储装置中,该计算机可读数据存储装置能够指示计算机或其它可编程数据处理设备按照特定方式工作,从而存储在计算机可读数据存储装置中的指令产生一种制造产品,所述制造产品包括实现流程图和/或方框图的一个或多个方框中规定的功能/动作的指令。
计算机程序指令也可被加载到计算机或其它可编程数据处理设备上,以使得在计算机或其它可编程设备上执行一系列的操作步骤以产生计算机实现的处理,从而在计算机或其它可编程设备上执行的指令提供用于实现流程图和/或方框图的一个或多个方框中规定的功能/动作的处理。
现在参照附图,具体地参照图1-2,提供可实现说明性实施例的数据处理环境的示例性示图。应该理解,图1-2仅是示例性的,而非意图断言或暗示关于可实现不同实施例的环境的任何限制。可做出对描述的环境的许多修改。
图1描述可实现说明性实施例的数据处理系统的网络的图形表示。网络数据处理系统100是可实现说明性实施例的计算机的网络。网络数据处理系统100包含网络102,网络102是用于提供在网络数据处理系统100内连接在一起的各种装置和计算机之间的通信链路的介质。网络102可包括连接,诸如有线、无线通信链路或光纤线缆。
在描述的例子中,服务器104和服务器106以及存储单元108连接到网络102。另外,客户机110、112和114连接到网络102。客户机110、112和114可以是例如个人计算机或网络计算机。在描述的例子中,服务器104将数据(诸如,引导文件、操作系统镜像、代码版本控制优化系统116的实施例和应用)提供给客户机110、112和114。在这个例子中,客户机110、112和114是服务器104的客户机。网络数据处理系统100可包括未示出的另外的服务器、客户机和其它装置。
在描述的例子中,网络数据处理系统100是具有网络102的互联网,网络102代表使用传输控制协议/互联网协议(TCP/IP)协议组彼此通信的全世界的网络和网关的集合。在互联网的中心是主节点或主机计算机之间的高速数据通信线路的骨干网,所述主节点或主机计算机包括对数据和消息进行路由的数以千计的商业、政府、教育和其它计算机系统。当然,网络数据处理系统100也可被实现为许多不同类型的网络,诸如例如内联网、局域网(LAN)或广域网(WAN)。图1旨在用作例子,而非用作对不同说明性实施例的架构限制。
参照图2,提供可用于本公开的各种实施例的示例性数据处理系统的方框图。在这个说明性例子中,数据处理系统200包括通信结构202,通信结构202提供处理器单元204、内存206、持久存储器208、通信单元210、输入/输出(I/O)单元212和显示器214之间的通信。
处理器单元204用于执行可被加载到内存206中的软件的指令。根据特定实现方式,处理器单元204可以是一组的一个或多个处理器,或者可以是多处理器核。另外,可使用一个或多个异构处理器系统实现处理器单元204,其中主要处理器与辅助处理器存在于单个芯片上。作为另一说明性例子,处理器单元204可以是包含相同类型的多个处理器的对称多处理器系统。
内存206和持久存储器208是存储装置216的例子。存储装置是能够暂时地和/或持久地存储信息(诸如,例如非限制性地,数据、函数形式的程序代码和/或其它合适的信息)的任何硬件。在这些例子中,内存206可以是例如随机存取存储器或任何其它合适的易失性或非易失性存储装置。根据特定实现方式,持久存储器208可采用各种形式。例如,持久存储器208可包含一个或多个部件或装置。例如,持久存储器208可以是硬盘驱动器、闪存、可重写光盘、可重写磁带或以上各项的某一组合。由持久存储器208使用的介质也可以是可移动的。例如,可移动硬盘驱动器可被用于持久存储器208。
在这些例子中,通信单元210提供与其它数据处理系统或装置的通信。在这些例子中,通信单元210是网络接口卡。通信单元210可通过使用物理通信链路或无线通信链路或二者提供通信。
输入/输出单元212允许利用可连接到数据处理系统200的其它装置输入和输出数据。例如,输入/输出单元212可通过键盘、鼠标和/或某一其它合适的输入装置提供用于用户输入的连接。另外,输入/输出单元212可将输出发送给打印机。显示器214提供用于将信息显示给用户的机构。
用于操作系统、应用和/或程序(包括图1的代码版本控制优化系统116的实施例)的指令可位于存储装置216中,存储装置216通过通信结构202与处理器单元204通信。在这些说明性例子中,指令以函数形式位于持久存储器208上。这些指令可被加载到内存206中以由处理器单元204执行。不同实施例的处理可由处理器单元204使用计算机实现的指令执行,所述计算机实现的指令可位于存储器(诸如,内存206)中。
这些指令被称为可由处理器单元204中的处理器读取并且执行的程序代码、计算机可用程序代码或计算机可读程序代码。不同实施例中的程序代码可被实现在不同物理或有形计算机可读存储介质(诸如,内存206或持久存储器208)上。
程序代码218以函数形式位于计算机可读存储介质220上,计算机可读存储介质220选择性地是可移动的并且可被加载到或传送给数据处理系统200以由处理器单元204执行。在这些例子中,程序代码218和计算机可读介质220形成计算机程序产品222。在一个例子中,计算机可读介质220可具有有形非暂态形式,诸如例如光盘或磁盘,所述光盘或磁盘被插入或放置在作为持久存储器208的一部分的驱动器或其它装置中以传送到存储装置(诸如,作为持久存储器208的一部分的硬盘驱动器)上。在有形形式下,计算机可读介质220也可采用连接到数据处理系统200的持久存储器的形式(诸如,形成包含图1的代码版本控制优化系统116的实施例的计算机可读存储装置224的硬盘驱动器、拇指驱动器或闪存)。计算机可读介质220的有形非暂态形式也被称为计算机可记录存储介质或计算机可读数据存储装置224。在一些实例中,计算机可读存储介质220可以不是可移动的。
替代地,包括图1的代码版本控制优化系统116的实施例的程序代码218可通过与通信单元210的通信链路和/或通过与输入/输出单元212的连接被从作为计算机可读信号介质226的计算机可读介质220传送给数据处理系统200。在计算机可读信号介质226的说明性例子中,通信链路和/或连接可以是物理的或无线的。
在一些说明性实施例中,程序代码218可经网络被从另一装置或数据处理系统下载到持久存储器208以在数据处理系统200内使用。例如,存储在服务器数据处理系统中的计算机可读数据存储装置中的程序代码可经网络被从服务器下载到数据处理系统200。提供程序代码218的数据处理系统可以是服务器计算机、客户机计算机或能够存储和发送程序代码218的某一其它装置。
使用图2的数据处理系统200作为例子,提供用于实现事务内存区域提升的代码版本控制的计算机实现的处理。处理器单元204接收一部分候选源代码,并且执行接收的该部分候选源代码的概括以用于并行执行。处理器单元204还利用进入和离开例程包裹关键区域以进入推测子处理。进入和离开例程还在运行时搜集冲突统计数据。处理器单元204产生包括多个循环版本的概括代码部分。处理器单元204还执行该概括代码部分以根据在运行时搜集的冲突统计数据确定使用多个循环版本中的哪一个。
使用公开的处理的实施例,增强编译器明智地通过将具有多个循环迭代的形式的更多工作聚集在关键区域中来扩大关键区域,以摊销事务内存(TM)进入和离开开销。使用TM提升的变换(以递增方式增加单个事务中的循环迭代的次数)利用成本模型小心地平衡冲突概率以及硬件的推测状态能力。使用与使用事务内存的每个变型关联的反映冲突的冲突概率的运行时统计数据,动态地调整该变换。
参照图3,提供了可用于本公开的各种实施例的代码版本控制优化系统的方框图。代码优化系统300是使用代码版本控制和基础计算平台的事务内存支持的本公开的选择性优化系统的例子。
代码版本控制优化系统300利用基础系统(诸如,图1的网络数据处理100或图2的数据处理系统200)的支持。在这个例子中,数据处理系统200代表实现本公开的实施例的主机系统。代码版本控制优化系统300包括许多功能元件,所述许多功能元件包括:源代码302,作为数据处理系统的输入;增强编译器304,包括成本计算器310;增强编译器运行时库320,包括线程库306、事务内存支持器308,还包括统计数据收集器314、统计数据分析器316和运行时调整器318。数据处理系统的输出是一组代码版本312。
代码版本控制优化系统300包括许多功能部件,可如前所述实现所述许多功能部件,或者可按照在一个或多个复合功能元件内包含功能元件的不同组合的另一方式实现所述许多功能部件。例如,在不损失功能的情况下,增强编译器304和成本计算器310可构成一个功能单元而非分立功能元件。在另一例子中,统计数据收集器314、统计数据分析器316和运行时调整器318可形成一个功能单元,而非保持作为分立功能元件。
源代码302以包括应用程序源代码的全部或一部分的指令集的形式提供公开的处理的其余子处理的输入材料。代表程序的一部分的源代码包括一个或多个关键区域以及一个或多个非关键区域。所述一个或多个关键区域应该被检查作为用于使用事务内存支持器308的候选。在线程库306以及308(还包括统计数据收集器314、统计数据分析器316、运行时调整器318)中提供的例程是增强编译器运行时库320的两个关键部件。
增强编译器304提供这样的能力:作为编译单元接收源代码302,并且通过一系列处理产生一组代码版本312。增强编译器304包括对下述操作的支持:利用线程库306进行概括以支持OpenMP并行区域,并且产生利用事务内存支持器308的代码。另外,增强编译器304包括对在产生一组代码版本312时使用成本计算器310的支持。事务内存支持器308还包括这样的能力:经统计数据收集器314在运行时环境中在执行期间针对识别的编译代码的各部分搜集统计数据。
线程库306提供用于使程序的编译版本能够利用多个线程执行的一批例程。在当前例子中,使用符合OpenMP规范的例程的库,然而,在不脱离公开的处理的情况下,可使用与OpenMP指定函数集合相当的其它函数库或集合。
事务内存支持器308提供以原子方式执行一组特定加载和存储指令(诸如,代码的关键区域中的加载和存储指令)的能力。事务内存支持器308提供用于在并行处理应用中建立的并行计算中并行控制对共享内存部分的访问的控制机制。硬件事务内存系统通常包括用于支持使用事务内存的事务的专用处理器、高速缓存和总线协议中的一个或多个或者其组合。在当前例子中,假设硬件事务内存支持在包括程序的指令集的关键区域中识别的指令的处理。
成本计算器310提供用于提供与指定代码路径关联的估计处理成本的一组服务。成本通常被反映在用于执行与处理识别的代码段关联的一系列操作的机器周期的数量。作为输出获得的识别的成本可被用在随后的处理中以基于哪个成本更为优选的确定来选择要使用的代码路径。
一组代码版本312是结合成本计算器310的增强编译器304的输出。该输出具有一个或多个代码版本的形式,其中代码版本特定于计算平台的硬件实现方式以及用于使用线程库306和事务内存支持器308的各候选资格。所述一组代码版本312中的每个版本代表选择的使用程序中的特定执行路径的优化。例如,第一代码版本支持与第一冲突参数(被称为conflictH1)关联的事务内存提升,第二代码版本支持与第二冲突参数(被称为conflictH2)关联的事务内存,并且第三代码版本支持在不使用事务内存的情况下的传统锁处理。收集运行时统计数据以用于调整相应地改变从三个版本类别选择的代码执行路径的下界(lb)、上界(ub)、conflictH1、conflictH2的调谐参数。例如,冲突是与使用事务内存的条件或推测加载或存储操作关联的重试操作。conflictH1、conflictH2的值在超过预定阈值时反映真(true),或者在未超过所述预定阈值时反映假(false)。conflictH1和conflictH2的默认设置是假以有利于事务内存代码路径的使用,并且如果记录了太多冲突,则运行时调整器可基于运行时统计数据将它们设置为真。
统计数据收集器314提供这样的能力:搜集与由增强编译器304编译的源代码的执行的运行时性能或其它特性关联的预定信息。搜集的典型统计数据包括执行时间、指令路径、冲突计数、高速缓存使用和等待时间。根据计算平台的需要和支持,统计数据能够特定于线程或线程的组合。
统计数据分析器316提供这样的能力:接收由统计数据收集器314收集的与由增强编译器304编译的源代码的运行时执行的运行时性能和其它特性关联的搜集的预定信息。执行分析以提供用于一组代码版本312中的版本控制条件的调谐参数。统计数据分析器316的输出可被保存在预定数据集中以便以后用于或立即用于程序的一个或多个运行时实例,从而提高程序的性能。例如,第一区域使用静态获得的版本控制条件执行程序代码的关键区域,且执行默认参数设置,分析运行时执行的统计数据。作为结果,程序代码的关键区域的下一次执行(或者一个或多个类似的并行区域的执行)可从分析结果接收修改的调谐参数以进入不同版本的代码路径。
运行时调整器318提供这样的能力:改变特定程序部分的下一个实例的处理,例如程序代码的以前执行的关键区域或者安排执行的一个或多个并行区域的下一次迭代。运行时调整器318根据从统计数据分析器316接收的信息,改变版本控制条件中的调谐参数,诸如上界(ub)或下界(lb)、conflictH1或conflictH2。例如,这种调整可改变可用的所述一组代码版本之一的选择。
在分别使用方程1和方程2的项的成本分析的情况下,使用图6和关联的文本进一步描述上界(ub)和下界(lb)。例如,假设循环具有n次迭代,每次迭代在关联的关键区域中具有c个周期,在非关键区域中具有nc个周期,并且t个线程执行并行循环。周期的数量‘c’代表在关键区域内花费的总时间(以机器周期测量),而周期的数量‘nc’代表在非关键区域中花费的总时间。周期的数量‘x’代表事务内存进入和离开开销。周期的数量‘y’代表默认锁定开销(每一个关键区域)。
使用描述的变量,在首次执行事务提升时获得方程1,其中在事务内执行循环的k次迭代。具体地讲,通过提升处理,n*(c+x+nc)/t变为n/k*((c+nc)*k+x)/t。然后,将n/k*((c+nc)*k+x)/t限制为小于n*(c+nc),n*(c+nc)是通过顺序执行而花费的时间;定义的不等式条件由方程1表示。利用事务内存和k次迭代,称为方程1或下界EQ1的成本表达式被定义为:n/k*((c+nc)*k+600)/t个周期。在k的这个值,其中k>600/((c+nc)*(t-1))。下界识别事务内存情况的性能开始超过串行执行实例的点。
方程2代表上界条件。通过将每个线程容量估计为M/T个字节,针对特定工作负载中的唯一加载和存储操作的总数计算上界。高速缓存中的推测状态缓冲器被表示为M个字节,并且硬件线程的总数被表示为T。每次推测加载或推测存储占用相应的高速缓存行,因此,在(M/T)/高速缓存行(方程2)中将线程容量进一步除以高速缓存行的大小。
源代码的简单编译包括将源代码翻译或变换为通常针对特定计算平台的可执行形式。替代简单编译,优化变换可被用于在运行时为应用提供更好的总体性能。优化能够使用各种变换以减少针对关键操作执行的指令的数量;重构产生的目标代码以最佳地利用特定硬件架构;改进特定存储子系统的使用,并且利用架构处理大量的共享内存并行化的能力。通常,与当使用简单编译进行编译时的情况相比,优化试图使应用运行得更快。
编程模型(诸如,OpenMP)允许程序员编写高性能代码;然而,优化通常需要在运行时性能、手编代码段和源代码的可移植性方面的折衷。例如,源代码的优化使用目标平台的硬件事务内存能力执行高阶变换,以通过提升源代码来提供另外的循环优化从而当优化可用时使用优化。这个例子可有助于处理大量的数字数据的科学应用。
参照图4,提供根据本公开的一个实施例的源代码片段的文本表示。
语句402代表与程序代码的非关键部分关联的一组语句。非关键代码段通常包括用于使用线程私有变量的计算的语句。语句406代表OMP规范,其中parallel for是用于创建parallel区域和工作共享for构造的组合形式构造。该语句指示希望使用OMP,OMP是图3的编译器运行时线程库306内的例程。
语句404代表与程序代码的关键部分关联的一组语句。关键代码区域通常包括用于使用共享变量的计算的语句,共享变量可由多个线程更新并且因此必须受到保护。语句408代表根据tm_atomicpragma规范的程序代码的关键区域的开始。
参照图5,提供根据本公开的一个实施例的代表图3的代码版本控制优化系统的处理的各阶段的源代码片段的文本表示。代码片段500代表从源代码到在使用公开的处理的利用循环版本控制的事务内存提升之后的代码的三个基本阶段。在代码片段500的例子中,NC1代表非关键区域1,NC2代表非关键区域2,并且C代表关键区域。
代码部分502代表根据OpenMP标准的使用编程语言C的语法的程序的一部分,其中如语句510#pragma omp parallel for中所指示,指定了OpenMP并行函数的使用。虽然记述了使用编程语言C的语法,但根据OpenMP标准,也存在使用编程语言Fortran的语法的等同方案。在示例性语句中,parallel for部分是用于创建parallel(并行)区域和工作共享for构造的组合形式构造。在类似例子中,程序开发者还能够指定语句#pragma parallel{#pragma for{ }},这将是等同的。
继续该例子,另外位于代码部分502中的语句508(也在图4中被示出为语句408)记述指示程序代码的关键区域的开始的pragmatm_atomic。pragma tm_atomic语句由图3的增强编译器304翻译为对例程tm_begin( )和tm_end( )的调用,例程tm_begin( )和tm_end( )分别负责进入和离开与各关键区域关联的推测子处理。
响应于代码部分502的初始处理,由增强编译器对接收的该部分程序代码执行概括操作以便能够在增强编译器运行时使用提供的线程库。这导致代码部分504中示出的代码。概括处理还对循环进行变换以经由下界和上界参数取得运行时行程计数(trip count)。如前面一样,进入和离开tm例程被调用以包裹如代码部分504中所示概括的程序代码中的关键区域。
响应于概括代码部分502的程序代码,在代码部分506中指示该处理的下一个步骤。代码部分506示出由当前上下文确定的在语句514、516和518中使用三个不同代码版本之一的选择性优化。语句514、516和518中的每个代码版本提供分立的路径,其中提供的两个代码版本采用事务内存使用的变型(如语句514和516中),而第三代码版本提供退路以使用传统处理并且不使用事务内存(如语句518中)。
在编译时期间,增强编译器产生代码部分506,例如具有版本控制条件的所有循环版本。总是产生代码部分504以支持并行执行。在运行时期间,收集统计数据以改变参数下界(lb)、上界(ub)、conflictH1、conflictH2,这些参数相应地改变代码执行的路径。这些特定参数最初具有默认值,但可根据冲突的量而被改变。然而,不使用统计数据重新编译代码(例如,仅在编译时期间产生代码一次并且以后在运行时期间改变代码)。
语句514中的第一个if语句确定是否满足用于事务内存使用和关联的conflictH1 520的阈值。当不满足第一个if语句的条件时,语句516(使用else if形式的语句)中的第二个if确定是否满足用于事务内存使用和关联的conflictH2 522的阈值。当也不满足事务内存使用条件时,如语句518中所示使用利用基于传统锁的处理的程序代码的版本。
公开的处理的实施例还配备代码部分506的例程以经由统计数据收集器在运行时搜集指示冲突的统计数据。响应于满足或超出预定阈值,给出与conflictH1 520或conflictH2 522关联的标记。如代码部分506中所示,当conflictH1 520或conflictH2 522被设置为返回值TRUE时,有效地忽略各事务内存代码版本,由此默认为基于锁的关键区域(代码部分506的最后的else语句518)。
通过运行一个工作共享而得知的信息因此被用于引导是否应该针对下一个工作共享再次使用事务内存。工作共享可位于程序代码的同一实例中,或者位于另一并行区域中。因此,从第一区域获得的信息可被重新用在该区域的代码部分的下一次迭代中,或者被应用于处理与第一区域相同的代码部分的实例的一个或多个其它区域。
另外,当动态工作共享有效时,语句524中的下界(lb)和上界(ub)参数可被调整以及使用许多线程以进一步提高进入利用代码的版本的事务内存的机会。
因此,公开的处理的实施例提供结合动态自适应运行时自动调整或自调谐功能的在编译时的静态分析和优化的能力,以根据当前上下文从可用的三个替代方案选择性地确定使用哪个代码路径。公开的处理的实施例以包括成本分析的变换框架的形式提供将循环的几次迭代捆绑在单个事务区域中的能力。
变换建立在504中示出的基础设施(OpenMP提供可从OpenMP.org获得的用于跨越多个平台的并行编程的应用编程接口(API)规范)的销售商特定实现方式中的唯一概括和工作负载分块(chunking)机制上。本公开的例子中的实施例提供这样的能力:通过将许多迭代捆绑在事务内存区域中来避免针对优化的循环的每次迭代引起每个事务的进入和离开开销。实施例在评估期间使用成本分析,成本分析考虑冲突概率和推测状态容量。
公开的处理中的成本分析(例如,如使用方程1和方程2所定义)未明确地考虑冲突概率。然而,存在隐含的直接关系,其中当捆绑在事务内存区域中的迭代的次数增加时,会在该区域中出现更多可能的冲突。该关系是直观的,因为当捆绑在事务内存区域中的迭代的次数增加时,预期更大的推测状态,因此,在事务内存区域内花费更长的时间。两种事件都增加事务内存区域遭受冲突的可能性。conflictH1520和conflictH2 522参数基于由统计数据分析器提供的事务内存区域所引起的实际冲突,接收运行时记录信息。因此,公开的成本分析未在编译时期间估计conflictH1 520和conflictH2 522,而是将各冲突值的计算留给运行时调整器。conflictH1 520和conflictH2 522的默认设置是假,以有利于事务内存代码路径的使用,并且如果记录了太多冲突,则运行时调整器可基于运行时统计数据将它们设置为真。
成本分析因此接收输入信息(包括工作负载、冲突的量、传统锁开销、事务内存进入和离开开销以及动态简报信息),以确定在运行时要执行的特定代码版本。使用OpenMP基础设施的编译器特定实现方式实现事务内存提升变换,以将循环的几次迭代(也被称为块大小)捆绑在一个事务区域中。
相应地针对在假设使用OpenMP定义的静态工作共享的情况下利用运行时检查产生的代码版本(包括基于锁的代码(传统代码)、基于事务内存的代码和具有事务内存提升变换的基于事务内存的代码),创建不同代码版本。当动态调度有效时,OpenMP运行时基于关于行程计数参数的动态简报信息执行自适应运行时优化。要注意的是,修改行程计数参数lb、ub对捆绑在tm区域中的循环迭代的次数具有直接影响,如524中所示。
因此,公开的处理的实施例包括一组操作,所述一组操作将已有概括机制用于OpenMP并行循环,在概括代码中执行与并行循环关联的循环成本分析和利用合适的循环版本控制的事务内存提升变换。
参照图6,提供根据本公开的一个实施例的与使用图3的代码版本控制优化系统关联的优化范围的方框图。优化范围600是用于从图5中描述的三个版本确定哪个特定代码版本适用的值的范围的例子。
为了准确地得出成本模型并且因此获得优化的成本602,根据周期的数量来刻画循环或工作负载。假设大值的n(许多循环迭代)和非常低的冲突概率,执行图4的例子中的代码所需的以机器周期表示的时间如下:
当使用事务内存将具有受保护的关键区域的循环并行化时:n*(c+x+nc)/t个周期;
当使用全局锁定将具有受保护的关键部分的循环并行化时:
n*(c+y),对于nc<=(c+y)*(t-1)对于非工作负载主导情况,或者
n*(c+y+nc)/t,对于nc>(c+y)*(t-1)对于工作负载主导情况;
(当一个线程的nc工作超过阈值时,能够直观地理解从非工作负载主导情况到工作负载主导情况的切换,并且能够与((c+y)*(系统中的其它线程的其余部分))交叠,并且因此被表示为(c+y)*(t-1))
当在单个核上使用单个线程顺序地执行时:n*(c+nc)
在当前上下文中假设大值的n意味着并行线程产生开销能够被忽略。如果n太小,则执行循环所花费的时间由OMP运行时开销(例如,线程产生、同步)主导。非常低的冲突概率被定义为这样的情况:事务内存区域不太经常回滚或者根本不回滚,因为回滚增加用于重新执行该区域的额外时间。公开的建模在这些假设下保持有效。
为了进一步阐明上界ub的约束,在运行时控制上界EQ2 606和下界EQ1 604中的下界lb参数。使用OMP,用户能够指定使用的线程的数量。在执行期间适用于线程的上界和下界(ub,lb)(例如,块大小)取决于队中(协作)的线程的数量,或者如另外所述的调度。
继续前一例子,假设进入开销和离开开销x的值是600个周期,并且事务区域的全局锁定开销y的值是200个周期。通过使用已知设备执行测量,可使用近似得出这些值。例如,记录在tm区域开始或锁定之前(当关键区域为空时)的时基寄存器值,然后在事务内存区域结束或解锁之后再次记录该时基寄存器。然后获得这两次操作之间的记录值之差。
具有简化方程1的形式的下界EQ1 604可随后被表示为k>600/(c+nc)。用于TM提升的阈值将因此是表示为if((ub-lb)>600/(c+nc)&&(ub-lb)*(内部的loads+stores)<2048)的条件。值600和2048取决于特定硬件系统。在使用的例子中,代表BlueGene Q系统的测量的600个周期被用作例子以示出本公开的概念(可从国际商用机器公司购得的超级计算机,参见:http://en.wikipedia.org/wiki/Blue_Gene)。
另外,当nc的值几乎为零(暗示不存在非关键代码的情况、或非关键代码花费非常少的时间的情况(例如,当仅递增共享变量(例如,a+=1,其中a是共享变量)时)之一)并且c的值是20个周期时,将会需要利用事务内存的31个线程与单个线程的性能相当。当c+nc的值大于600(前面提及的进入开销和离开开销的值)时,利用事务内存的2个线程开始超过串行执行(单线程实例)。
当事务内存区域被人为地增加到例如捆绑在单个事务中的循环的k次迭代的值(块大小)时,事务内存情况变得更加吸引人使用。利用事务内存和k次迭代,成本表达式变为:n/k*((c+nc)*k+600)/t个周期。在k的这个值,其中k>600/((c+nc)*(t-1)),被称为方程1或下界EQ1 604,事务内存情况的性能开始超过串行执行实例。两个事务内存线程因此在k>600/(c+nc)开始超过单个线程。
响应于获得对要被捆绑在单个事务中的循环的迭代的估计,公开的处理的实施例的成本模型开始确保不发生容量溢出。应用保守估计,保守估计取决于机器并且应该使用目标实现方式的特定硬件平台以合适的机器参数替换保守估计。假设高速缓存中的推测状态缓冲器具有M字节的大小并且硬件线程的总数为T,则每个线程被估计为具有M/T字节的容量。进行进一步的假设:每个推测加载或每个推测存储将占用相应的高速缓存行。因此,将各线程容量(M/T)除以表示为(M/T)/高速缓存行并且被称为方程2或上界EQ2 606的高速缓存行的大小。
方程2被用作针对各工作负载中的唯一加载和存储的总数的上界。使用Blue Gene/Q作为例子,具有实现在L2高速缓存中的大约16M大小的推测缓冲器、每节点64个硬件线程和128字节L2高速缓存行大小,上限将会被估计为:2048次加载或存储。(16M/64除以128得出2048,如方程2中所示)
假设静态工作共享,方程1和方程2因此被用于得出用于确定事务内存使用的代码版本的使用的阈值和用于确定利用循环版本控制的事务内存提升的代码版本的使用的阈值,如图5中所示。能够容易地对循环内的加载和存储的次数进行计数,并且将该计数乘以通过方程1计算的k。当所获得的值超过从方程2计算的值时,需要使k变得更小。约束公式因此被表示为:(单次循环迭代中的加载+存储的次数)*(从方程1计算的k)<方程2。根据图5的代码部分506,下界lb和上界ub在运行时被传递给outlined_func。ub-lb因此是如前所述的k的值。因此通过将k的值插入到刚刚描述的约束公式中来计算用于TM提升的阈值。当满足在约束中表示的条件时,指令进入到在相应if条件中定义的代码段(图5的三个代码版本之一)。
参照图7,提供根据本公开的一个实施例的使用图3的代码版本控制优化系统的编译时处理的流程图。处理700是使用图3的代码版本控制优化系统300的处理的例子。
处理700开始(步骤702),并且接收一部分候选源代码(步骤704)。候选源包含可进行并行处理的程序的程序源代码语句。
处理700概括接收的该部分候选源代码(步骤706)。概括器操作通常从被称为主机或初始函数的指定函数提取代码段(一个或多个连续的程序代码语句),由此创建新函数。新函数被称为概括函数。概括操作以对新创建的概括函数的调用替换原始代码段。使用该技术以便能够实现概括函数的并行执行。在公开的处理中,包裹关键代码区域的进入和离开例程是tm_begin/tm_end例程,tm_begin/tm_end例程分别开始和结束推测子处理。在当前情况下,对OpenMP并行循环执行概括。
处理700提供逻辑流程。添加用于实现在运行时的冲突统计数据的搜集的进入和离开例程(步骤708)。分析在运行时获得的冲突统计数据以帮助与版本控制条件关联的上界参数和下界参数的调整,或者设置conflictH1、conflictH2参数。在根据周期的数量刻画循环/工作负载之后,定义循环成本。周期值是依赖于使用的基础硬件平台的依赖于机器的值。
执行使用事务内存提升的具有关键区域的并行化循环所花费的时间使用被定义为n*(c+x+nc)/t个机器周期的成本表达式。执行使用默认全局锁定的具有关键区域的并行化循环所花费的时间使用如下定义的成本表达式:n*(c+y),对于nc<=(c+y)*(t-1);以及n*(c+y+nc)/t,对于nc>(c+y)*(t-1),对于工作负载主导情况。在单个核上在没有任何并行化的情况下使用单个线程顺序地执行循环使用如下定义的成本表达式:n*(c+nc)。
处理700产生包括多个循环版本的概括代码部分(步骤710)。所述多个循环版本被包含在具有由关键区域进入和离开例程包裹的关键区域的候选源代码的概括表示中。所述多个循环版本代表使用事务内存将具有关键区域的循环并行化的版本、使用全局锁定将具有关键区域的循环并行化的版本、和在单个核上使用单个线程使用顺序执行的版本。其后,处理700结束(步骤712)。
参照图8,提供根据本公开的一个实施例的使用图3的代码版本控制优化系统的运行时处理的流程图。处理800是使用图3的代码版本控制优化系统300的实施例和来自图7的处理700的中间结果的运行时处理的例子。
处理800开始,并且执行概括和配备的多个循环版本代码部分(步骤804)。所述多个循环版本包括先前产生的版本:特定于使用事务内存将具有关键区域的循环并行化的版本、为了使用全局锁定将具有关键区域的循环并行化而创建的版本、和在单个核上使用单个线程使用顺序执行的版本。
在执行期间,设备在运行时搜集冲突统计数据,冲突统计数据被分析以确定是否应该改变利用与第一版本控制条件关联的冲突参数的用于事务内存提升的预定阈值(步骤806)(例如,通过将conflictH1设置为真)。响应于确定不满足利用第一冲突的用于事务内存提升的所述预定阈值,处理800选择和使用事务内存提升方案(步骤808),之后结束(步骤816)。在本公开的上下文中的事务内存提升是指从正在处理的循环的内部到正在处理的循环的外部的事务内存编译指示(或区域)的提升。
响应于确定满足利用与第一版本控制条件关联的冲突参数的用于事务内存提升的所述预定阈值,处理800确定是否满足利用与第二版本控制条件关联的第二冲突参数的用于事务内存提升的预定阈值(步骤810)。响应于确定不满足利用与第二版本控制条件关联的第二冲突参数的用于事务内存的所述预定阈值,处理800选择和使用事务内存方案(步骤812),之后结束(步骤816)。响应于确定满足利用与第二版本控制条件关联的第二冲突参数的用于事务内存的所述预定阈值,处理800使用默认的基于锁的方案(步骤814),之后结束(步骤816)。
因此,在说明性实施例中,提供了一种用于实现事务内存区域提升的代码版本控制的计算机实现的处理,所述计算机实现的处理接收一部分候选源代码并且概括接收的该部分候选源代码以用于并行执行。所述计算机实现的处理利用进入和离开例程包裹关键区域以进入推测子处理,并且同时,在运行时搜集冲突统计数据。所述计算机实现的处理产生包括多个循环版本的概括代码部分。利用运行时统计数据执行概括代码部分;并且根据在运行时搜集的冲突统计数据确定执行多个循环版本中的哪一个。
在一个实施例中,一种用于实现事务内存区域提升的代码版本控制的计算机实现的处理通过根据机器周期的数量刻画循环或工作负载来估计要被捆绑在单个事务中的循环的迭代次数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变为n/k*((c+nc)*k+x)/t。然后,将n/k*((c+nc)*k+x)/t限制为小于n*(c+nc),n*(c+nc)是通过顺序执行花费的时间,定义的不等式条件由方程1表示。
所述计算机实现处理还通过将每个线程容量估计为M/T个字节来针对工作负载中的唯一加载和存储的总数计算上界,其中高速缓存中的推测状态缓冲器是M个字节,并且硬件线程的总数是T,并且其中每个推测加载或推测存储占用它自己的高速缓存行,因此,如在(M/T)/高速缓存行(方程2)中,将线程容量进一步除以高速缓存行的大小;并且使用方程1和方程2计算用于事务内存(TM)的阈值和用于利用循环版本控制的事务内存提升的阈值。
附图中的流程图和方框图表示根据本发明的各种实施例的系统、方法和计算机程序产品的可能的实现方式的架构、功能和操作。在这个方面,流程图或方框图中的每个方框可代表包括用于实现规定的逻辑功能的一个或多个可执行指令的代码的模块、段或一部分。还应该注意的是,在一些替代实现方式中,方框中标注的功能可能不按附图中标注的次序执行。例如,事实上,根据涉及的功能,连续示出的两个方框可基本上同时执行,或者这些方框有时可按照相反的次序执行。还应该注意的是,方框图和/或流程图中的每个方框以及方框图和/或流程图中的方框的组合能够由执行规定的功能或动作的基于专用硬件的系统或专用硬件和计算机指令的组合实现。
以下权利要求中的所有装置或步骤加功能元件的对应结构、材料、动作和等同物旨在包括用于结合具体要求保护的其它要求保护的元件执行功能的任何结构、材料或动作。本发明的描述用于说明和描述的目的,而非是穷尽的或者局限于公开的形式的本发明。在不脱离本发明的范围和精神的情况下,对于本领域普通技术人员而言,许多修改和变化将会是清楚的。选择并描述实施例以便最好地解释本发明的原理和实际应用,并且使其他本领域普通技术人员能够理解本发明的具有适合设想的特定用途的各种修改的各种实施例。
本发明能够采用完全硬件实施例、完全软件实施例或者既包含硬件元件又包含软件元件的实施例的形式。在优选实施例中,本发明被实现于软件,所述软件包括但不限于固件、常驻软件、微码和可由本领域技术人员识别的其它软件介质。
很重要地,需要注意的是,尽管已在全功能数据处理系统的情况下描述本发明,但本领域普通技术人员将会理解,本发明的处理能够以计算机可读数据存储装置的形式分布,所述计算机可读数据存储装置具有以各种形式存储在它上面的计算机可执行指令。计算机可读数据存储装置的例子包括可记录类型介质,诸如软盘、硬盘驱动器、RAM、CD-ROM、DVD-ROM。计算机可执行指令可采用编码格式的形式,所述编码格式被解码以实际用在特定数据处理系统中。
适合存储和/或执行包括程序代码的计算机可执行指令的数据处理系统将包括直接或通过系统总线间接耦接到存储元件的一个或多个处理器。存储元件能够包括:本地存储器,在程序代码的实际执行期间采用;大容量存储器;和高速缓存,其提供至少某一程序代码的临时存储以减少在执行期间必须从大容量存储器检索代码的次数。
输入/输出或I/O装置(包括,但不限于,键盘、显示器、定点装置等)能够直接地或通过中间I/O控制器耦接到该系统。
网络适配器也可耦接到该系统以便能够使数据处理系统通过中间私有或公共网络耦接到其它数据处理系统或远程打印机或存储装置。调制解调器、线缆调制解调器和以太网卡仅是一些当前可用类型的网络适配器。