减少64位计算机程序循环中符号扩展指令的需求驱动算法的制作方法与工艺

文档序号:12008814阅读:297来源:国知局
减少64位计算机程序循环中符号扩展指令的需求驱动算法的制作方法与工艺
减少64位计算机程序循环中符号扩展指令的需求驱动算法相关申请的交叉引用本申请要求于2011年11月7日提交的序列号为61/556,782的美国临时专利申请、以及于2012年10月26日提交的序列号为13/661,478的美国专利申请的优先权。在此通过援引的方式对这些申请的每一个加以合并。技术领域本发明总地涉及计算机处理,并且更具体地,涉及减少包括在64位计算机程序的循环(loop)中的符号扩展指令的需求驱动算法。

背景技术:
开发者使用编译器来从高级源代码生成可执行程序。一般地,编译器配置为接收程序的高级源代码(例如以C++或Java所编写)、确定程序将在其上执行的目标硬件平台(例如x86处理器)、以及随后将高级源代码转译成可在目标硬件平台上执行的汇编级代码。该配置提供以下优点:使开发者能够编写单一高级源代码程序以及随后将该程序的目标定为跨多种硬件平台而执行,诸如移动设备、个人计算机或服务器。通常,编译器包括三个部件:前端、中端和后端。前端配置为确保高级源代码满足编程语言语法和语义,于是前端单元生成高级源代码的第一中间表示(intermediaterepresentation,IR)。中端配置为接收和优化第一IR,其通常涉及例如如果存在任何包括在第一IR中的不可达代码的话,移除该不可达代码。在优化第一IR后,中端生成第二IR用于后端来处理。具体来讲,后端接收第二IR并将第二IR转译成汇编级代码。汇编级代码包括在作为目标硬件平台的一部分的处理器上可直接执行的低级汇编指令。在一些情况下,程序在“64位模式”下执行,其中基本存储器地址是64位值(例如int64变量)并且存储器偏移是32位值(例如int32变量)。因此,典型的地址计算,例如关于特定的阵列索引,要求将32位存储器偏移加到64位基本地址。对于实施该加法的处理器来说,该处理器必须首先将32位存储器偏移转换成64位存储器偏移,使得与存储器偏移相关联的位数和与64位基本地址相关联的位数对齐。这种转换在本文称为“符号扩展(sign-extension)”,具体来讲,其涉及增加二进制数的位数同时保留数的符号(即正/负)和值。虽然符号扩展操作不是非常高成本的操作,但包括在循环中的符号扩展操作抑制重要的被称为“循环强度缩小”的循环优化。注意,在“64位模式”下执行的几乎所有代码都包括相当多的循环,这些循环的许多包括符号扩展指令。一种用于消除在循环之内的32位变量到64位变量的符号扩展的技术,涉及通过在循环的前置头(preheader)中实施符号扩展来在循环外将变量转换成64位变量以及用针对所提升的变量的64位操作来替换针对初始32位变量的所有32位操作。然而该变换做出重要的假定,即没有初始32位操作使整数溢出。该假定对于类似C和C++的普通编程语言有效,在该类语言中未定义依赖于有符号的算术运算符的溢出的任何程序。针对64位寄存器和操作没有额外成本的架构,这种优化总是有优势的。然而,针对64位寄存器和操作要求附加资源的架构,必须进行仔细的考虑,并且对选择性地挑选该优化的成本收益分析是可取的,这是因为64位寄存器和操作的使用可增加寄存器不足并消耗更多周期。因此,本领域所需要的是用于使用成本收益分析来识别符号扩展指令以消除的技术,以及用于针对程序的低级中间表示(IR)实施变换的方法。

技术实现要素:
本发明的一个实施例阐述了用于减少包括在计算机程序中的符号扩展指令(SEI)的方法。方法包括以下步骤:接收中间代码,所述中间代码与计算机程序相关联并包括被包括在计算机程序内的循环结构中的第一SEI;确定第一SEI适格被移动到循环结构之外;将第二SEI插入到循环的前置头中,该第二SEI当由处理器所执行时,将由第一SEI定为目标的初始值从较小类型提升到较大类型;以及用适格于附加的编译器优化的一个或多个中间指令替换第一SEI。所公开的实施例的一个优点是,编译器自动识别包括在计算机程序的循环中的符号扩展指令并在其初始被包括在其中的循环之外置换(displace)符号扩展指令。编译器随后修改在循环之内的指令以说明所移除的符号扩展指令使得计算机程序的正确性保持完整。因此,处理器执行程序所要求的时钟周期数目可减少,这与整体功率节省直接相关。附图说明因此,可以详细地理解本发明的上述特征,并且可以参考实施例得到对如上面所简要概括的本发明更具体的描述,其中一些实施例在附图中示出。然而,应当注意的是,附图仅示出了本发明的典型实施例,因此不应被认为是对其范围的限制,本发明可以具有其他等效的实施例。图1是示出了配置为实现本发明的一个或多个方面的计算机系统的框图。图2A-2D示出了根据本发明的一个实施例的、用于减少包括在64位计算机程序的循环中的符号扩展指令的方法步骤的流程图。具体实施方式在下面的描述中,将阐述大量的具体细节以提供对本发明更透彻的理解。然而,本领域的技术人员应该清楚,本发明可以在没有一个或多个这些具体细节的情况下得以实施。系统概述图1为示出了配置为实现本发明的一个或多个方面的计算机系统100的框图。计算机系统100包括经由可以包括存储器桥105的互连路径通信的中央处理单元(CPU)102和系统存储器104。存储器桥105可以是例如北桥芯片,经由总线或其他通信路径106(例如超传输(HyperTransport)链路)连接到I/O(输入/输出)桥107。I/O桥107可以是例如南桥芯片,从一个或多个用户输入设备108(例如键盘、鼠标)接收用户输入并且经由通信路径106和存储器桥105将该输入转发到CPU102。并行处理子系统112经由总线或第二通信路径113(例如外围部件互连(PCI)Express、加速图形端口或超传输链路)耦连到存储器桥105;在一个实施例中,并行处理子系统112是将像素传递到显示设备110的图形子系统,该显示设备110可以是任何传统的阴极射线管、液晶显示器、发光二极管显示器等等。系统盘114也连接到I/O桥107并可配置为存储用于由CPU102和并行处理子系统112使用的内容和应用和数据。系统盘114提供用于应用和数据的非易失性存储并可包括固定的或可移动的硬盘驱动器、闪存设备以及CD-ROM(压缩光盘只读存储器)、DVD-ROM(数字通用光盘ROM)、蓝光、HD-DVD(高清晰度DVD)或其他磁式、光学或固态存储设备。交换器116提供I/O桥107与诸如网络适配器118以及各种插卡120和121的其他部件之间的连接。其他部件(未明确示出),包括通用串行总线(USB)或其他端口连接、压缩光盘(CD)驱动器、数字通用光盘(DVD)驱动器、胶片录制设备及类似部件,也可以连接到I/O桥107。图1所示的各种通信路径包括具体命名的通信路径106和113可以使用任何适合的协议实现,诸如PCIExpress、AGP(加速图形端口)、超传输或者任何其他总线或点到点通信协议,并且如本领域已知的,不同设备间的连接可使用不同协议。在一个实施例中,并行处理子系统112包含经优化用于图形和视频处理的电路,包括例如视频输出电路,并且构成图形处理单元(GPU)。在另一个实施例中,并行处理子系统112包含经优化用于通用处理的电路,同时保留底层(underlying)的计算架构,本文将更详细地进行描述。在又一个实施例中,可以将并行处理子系统112与一个或多个其他系统元件集成在单个子系统中,诸如结合存储器桥105、CPU102以及I/O桥107,以形成片上系统(SoC)。在一个实施例中,并行处理子系统112包括一个或多个并行处理单元(PPU),每个并行处理单元耦连到本地并行处理(PP)存储器。通常,并行处理子系统112包括U个PPU,其中U>=1。在一些实施例中,并行处理子系统112中的一些或所有PPU是具有渲染管线的图形处理器,其可以配置为实施与下述有关的各种操作:经由存储器桥105和第二通信路径113从CPU102和/或系统存储器104所供应的图形数据生成像素数据,与本地并行处理存储器(可被用作图形存储器,包括例如常规帧缓冲区(buffer))交互以存储和更新像素数据,传递像素数据到显示设备110等等。在一些实施例中,并行处理子系统112可包括一个或多个作为图形处理器而操作的PPU以及一个或多个用于通用计算的其他PPU。这些PPU可以是同样的或不同的,并且每个PPU可具有专用并行处理存储器设备或不具有专用并行处理存储器设备。应该理解,图1的系统是示例性的,并且变化和修改都是可能的。连接拓扑,包括桥的数目和布置、CPU102的数目以及并行处理子系统112的数目,可根据需要修改。例如,在一些实施例中,系统存储器104直接连接到CPU102而不是通过桥,并且其他设备经由存储器桥105和CPU102与系统存储器104通信。在其他替代性拓扑中,并行处理子系统112连接到I/O桥107或直接连接到CPU102,而不是连接到存储器桥105。而在其他实施例中,I/O桥107和存储器桥105可能被集成到单个芯片上而不是作为一个或多个分立设备存在。大型实施例可以包括两个或两个以上的CPU102以及两个或两个以上的并行处理子系统112。本文所示的特定部件是可选的;例如,任何数目的插卡或外围设备都可能得到支持。在一些实施例中,交换器116被去掉,网络适配器118和插卡120、121直接连接到I/O桥107。减少包括在64位计算机程序的循环中的符号扩展指令如本文更详细所阐述的,本发明涉及在图1的计算机系统100上执行的编译器150。编译器150配置为实现算法以简化构成计算机程序的中间指令。具体来讲,编译器150配置为识别包括至少一个适格被移动到循环之外的符号扩展指令的中间代码中的循环。循环以最内层循环优先顺序处理。下面是编译器150处理中间代码的方式的详细描述。图2A-2D示出了根据本发明的一个实施例的、用于减少包括在64位计算机程序的循环中的符号扩展指令的方法步骤200的流程图。虽然结合图1的系统来描述方法步骤,但本领域的普通技术人员应理解的是,配置为以任何顺序实施方法步骤的任何系统均在本发明的范围内。如图2A所示,方法200在步骤202开始,其中编译器150接收包括至少一个循环的计算机程序的中间代码。在步骤204,编译器150初始化具有(键)→(值)格式的(v1,<类型>)→(v2)的映射表,其中v2是v1的经符号扩展的值并且v2类型是<类型>。“类型”的示例包括int32(即32位整数)和int64(即64位整数)。例如,如果v1是32位整数,那么(v1,int64)→(v2)意思是v2是v1的32位整数值的64位整数表示。v2相当于v1的符号扩展并可用来代替这种符号扩展。在步骤206,编译器150设置当前循环以最内层循环优先顺序指向中间代码的第一循环。在一个示例中,中间代码如下所示:在上述示例中,中间代码的第一循环是循环的“主体(body)”并包括6个单独的指令。因此,在首次经过步骤206后,当前循环指向“主体”循环。在步骤208,编译器150确定当前循环是否包括至少一个“t1=sxt(t2)”形式的符号扩展指令(SEI)。在上述示例中,中间指令“temp1.i64=sxt(i1.i32)”满足步骤208的标准。在该示例中,指令“temp1.i64=sxt(i1.i32)”防止表达式“4*tmp1.i64”的强度减少。因此,编译器150的目标是修改在步骤202所接收的中间代码,使得通过将i1.i32提升到64位值来消除“i1.i32”的符号扩展。如果在步骤208,编译器150确定当前循环包括至少一个“t1=sxt(t2)”形式的SEI,那么方法200前进到步骤210。否则,方法200前进到图2B的步骤218,该步骤如下文所阐述,涉及确定在中间代码中是否包括可能包括符号扩展指令的附加的循环。在步骤210,编译器150设置当前SEI指向当前循环的第一SEI。以上文示例继续,在首次经过步骤210后当前SEI将指向SEI“temp1.i64=sxt(i1.i32)”。在步骤212,编译器150确定当前SEI(即“temp1.i64=sxt(i1.i32)”)是否由当前循环的归纳变量所使用,以及确定当前SEI的t1(即“temp1.i64”)的所有使用是否是仿射的(affine)。例如,上文示例中的代码“4*temp1.i64”是仿射使用。如果步骤212的结果为真,那么当前SEI候选以消除,并且方法200前进到步骤222,如下所述。否则方法200前进到步骤214,同样如下所述。在步骤222,编译器150确定当前SEI的t2操作数是否是当前循环中的叶。在一个实施例中,如果t2被定义在当前循环之外,或如果t2既不是非溢出二进制运算符、phi运算符,也不是转换运算符(例如符号扩展或零扩展),那么t2视为当前循环的叶。如果在步骤222,编译器150确定当前SEI的t2是当前循环的叶,那么方法222前进回到步骤214,如下所述。否则,方法200前进到步骤224,其中编译器150将当前SEI推到SEI堆栈上。该堆栈表示要被处理的符号扩展指令的列表并使编译器150能够将SEI推到SEI堆栈上以及从SEI堆栈弹出SEI。以上文示例继续,堆栈成为{“tmp1.i64=sxt(i1.i32)”}并且映射表是{}。在步骤226,编译器150确定SEI堆栈是否为空。如果在步骤226,编译器确定SEI堆栈为空,那么方法200前进到步骤214,如下所述。否则,方法200前进到步骤228,其中编译器150从SEI堆栈弹出临时SEI。在步骤230,编译器150确定临时SEI是否是当前循环的叶。如果在步骤230,编译器150确定临时SEI的t2是当前循环的叶,那么方法200前进到图2C的步骤232,如下所述。否则,方法200前进回到步骤226,如上文所述。以上文示例继续,“i1.i32”被定义在循环之内,所以“i1.i32”不视为叶。在步骤232,编译器150确定是否1)临时SEI是“t1=sxt(t2)”形式以及2)临时SEI的t2是“t2=opxy”形式。如果在步骤232编译器150确定1)临时SEI是“t1=sxt(t2)”形式,以及2)临时SEI的t2是“t2=opxy”形式,那么方法200前进到步骤234。否则,方法200前进回到图2B的步骤226,如上所述。在步骤234,编译器150确定对于键(x,<临时SEI的t1的类型>)在映射表中是否存在值。以上文示例继续,t2是“i1.i32=phi(i0.i32:preheader,i2.i32:loopbody)”并且映射表为空。如果在步骤234,编译器150确定对于键(x,<临时SEI的t1的类型>)在映射表中存在值,那么方法200前进到步骤238,如下所述。否则,方法200前进到步骤236,其中编译器150会1)将SEI“x’=sxt(x)”推到SEI堆栈上,以及2)在使用临时SEI的t2中的x之前将x’插入到中间代码中。在步骤238,编译器150确定对于键(y,<临时SEI的t1的类型>)在映射表中是否存在值。如果在步骤238,编译器150确定对于键(y,<临时SEI的t1的类型>)在映射表中存在值,那么方法200前进到步骤242,如下所述。否则,方法200前进到步骤240,其中编译器150会1)将SEI“y’=sxt(y)”推到SEI堆栈上,2)在使用临时SEI的t2中的y之前将y’插入到中间代码中。注意,步骤240的执行涉及将符号扩展插入到当前循环的前置头代码中。相应地,方法200前进到步骤242,其中编译器150在临时SEI的t2之后将SEI“t2'=opx’y’”插入到中间代码中,并且更新映射表以包括映射(t2,<类型(t2’)>)→t2’。方法200随后前进到图2D的步骤244。以上文示例继续,SEI堆栈包含{“i0’.i64=sxt(i0.i32)”,“i2’.i64=sxt(i2.i32)”}并且映射表包含{<i1.i64>→i1’}。进一步地,中间代码成为:如此使得“tmp1.i64”的所有使用都由“i1’.i64”所替换,并且“tmp1.i64=sxt(i1.i32)”被删除。注意,当在使用前插入新的符号扩展指令时,phi指令被特殊对待。在phi中的使用,诸如“i0.i32:preheader”,被当做针对当前循环的前置头块中的最后指令的使用。在SSA表示中这是显现在phi指令中的使用的标准解释。在步骤244,编译器150在映射表中将键(t2,<临时SEI的t1的类型>)映射到t2’的值。在步骤246,编译器150在当前循环中用t2’替换t1的所有出现。在步骤248,编译器150从当前循环中移除临时SEI。方法200随后返回图2B的步骤226,其中重复方法步骤228-248直到SEI堆栈为空。以上文示例继续,因为i0.i32被定义在循环之外,所以SEI“i0’.i64=sxt(i0.i32)”是叶,并且因此被方法200所忽视。可替代地,SEI“i2’.i64=sxt(i2.i32)”适格于步骤240的操作。根据本文所述的技术,修改SEI“i2’.i64=sxt(i2.i32)”将涉及编译器150在SEI“i2.i32=i1.i32+1”之后插入SEI“i3.i64=i1’.i64+1”、用“i3’.i64”替换“i2’.i64”的所有实例、以及删除SEI“i2’.i64=sxt(i2.i32)”。相应地,消除所有符号扩展之后的中间代码是:结果是,{i0,i1,i2}的32位计算提升到{i0’,i1’,i3’}的64位计算。这有利地允许后续的编译器150优化操作,诸如强度减少和归纳变量消除,以消除冗余的32位计算。现在回到步骤208,如果编译器150确定当前循环不包括至少一个“t1=sxt(t2)”形式的SEI,那么方法200前进到上文所述的图2B的步骤218。现在回到步骤212,如果编译器150确定当前SEI的“t2”不是当前循环的归纳变量仿射函数,那么方法200前进到步骤214,其中编译器150确定在当前循环中是否包括附加的SEI。如果在步骤214,编译器150确定在当前循环中包括附加的SEI,那么方法200前进到步骤216,如下文所述。否则,方法200前进到图2B的步骤218,如上文所述。在步骤216,编译器150设置当前SEI指向当前循环的下一个SEI。如本文先前所述,编译器150配置为以最内层循环优先顺序来处理循环,这允许当后续处理封闭循环时消除被插入到循环前置头中的符号扩展。在步骤218,编译器150确定在中间代码中是否包括附加的循环。如果在步骤218,编译器150确定在中间代码中包括附加的循环,那么方法200前进到步骤220,如下文所述。否则,根据本文所描述的技术,由于包括在中间代码中的每个循环已由编译器150所检查,所以方法200结束。在步骤220,编译器150将当前循环设置为包括在中间代码中的下一个循环。方法200随后前进回到步骤208,于是根据上述描述实行后续的步骤210-248。总而言之,本发明的实施例阐述了用于减少包括在计算机程序的循环中的SEI的技术。编译器150接收计算机程序的中间代码,其中中间代码包括被包括在循环结构中的至少一个SEI。根据上文所述的方法200,编译器150确定至少一个SEI适格被移动到循环结构之外、将补充的SEI插入到循环结构的前置头中、以及随后消除循环中的SEI,这使代码适格于附加的强度减少机会。本文公开的技术的一个优点是所编译的中间指令由编译器150对附加的优化机会进行自动检查。通过该方式,计算机程序所包括的、或当运行计算机程序时计算机程序要求处理器所执行的指令的总数可减少,从而增加计算机程序的整体执行效率。此外,更少或更有效率的指令致使执行计算机程序要求更少的时钟周期,这与整体功率节省直接相关。本发明的一个实施例可实现为与计算机系统一起使用的程序产品。该程序产品的程序定义实施例的各功能(包括本文中描述的方法)并且可以被包含在各种计算机可读存储介质上。示例性计算机可读存储介质包括但不限于:(i)不可写入的存储介质(例如,计算机内的只读存储器设备,诸如可由光盘只读存储器(CD-ROM)驱动器读取的CD-ROM盘、闪存、只读存储器(ROM)芯片或任何类型的固态非易失性半导体存储器),在其上永久性地存储信息;和(ii)可写入的存储介质(例如,软盘驱动器或硬盘驱动器内的软盘或者任何类型的固态随机存取半导体存储器),在其上存储可更改的信息。以上已参照特定实施例对本发明进行了描述。然而,本领域普通技术人员将理解的是,可对此做出各种修改和变化,而不脱离如所附权利要求中所阐述的本发明的较宽精神和范围。因此,前面的描述以及附图应被视为是示例性的而非限制性的意义。因此,本发明的实施例的范围在下面的权利要求中阐述。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1