版权归原作者所有,如有侵权,请联系我们

[科普中国]-绿色编译器

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

绿色编译器是指在完成源代码到目标代码等价转换的前提下,以降低软件运行时能耗,提高资源利用率,减少设备损耗为主要优化目标,并能提高软件开发效率,减少软件开发过程中资源消耗的编译器。主要包括三个基本指标:能耗的节约、资源利用率的提高、环境污染的减少。

简介随着绿色需求的日趋迫切,各个领域的专家学者从自身对绿色需求的了解,提出了很多与“绿色”相关的定义,如绿色计算,、绿色网络、绿色存储、绿色操作系统等。虽然这些定义各不相同,但总的来说主要包括三个基本指标:能耗的节约、资源利用率的提高、环境污染的减少。绿色编译器也不例外,是指使生成的程序具有较高的资源利用率、较低的能耗和较慢的损耗速度,以提高设备高效使用时间,减少电子垃圾的产生,进而减少对环境的污染,而且能够为其生成的软件提供友好的调试和测试信息,以帮助开发者提高开发效率,减少开发过程中高额的资源和能源消耗的编译器1。同时,编译器是程序语言转换的工具,也必须保证目标语义同原语义等价。

背景和可能性在信息化、电子化高速发展,各种便携式移动设备如智能手机、PAD、平板电脑等被广泛应用于人们的日常生活和工作中,极大地方便和丰富了人们的物质文化生活。但与此同时,电子产品的快速普及不但消耗了巨大的能源(仅个人计算机消耗的能源就占到全部电力的12%),释放了大量的温室气体,而且废弃的电子垃圾中含有铅、铬、镉和水银等有毒物质,其排放将严重污染土壤、水等环境资源,给人们的正常生活带来不可忽视的负面影响。全球技术调查机构高德纳(Gartner)对碳排放量的统计结果显示,IT行业的碳排放比重已经等同于航空业。而且巨大的能源消耗大大增加了 IT 产品本身的成本,2010 年全球 IT 技术的花费已经达到3万亿美元,IT产品同人们的生活更加密切,其对环境的影响将进一步加大。Mc Kinsey报告指出,到2020年,手提电脑、智能手机、平板电脑等各种IT设备将成为温室气体排放最多的源头之一)。在电子垃圾方面,联合国环境规划署(UNEP)指出,在2010年,美国产生了300万吨电子垃圾,中国也产生了230万吨电子垃圾,全球每年将产生4000万吨电子垃圾。而且据其预测,如果仍不采取相应的保护手段,到2020年,各个国家在各个领域(如旧电脑、电视、手机等)产生的电子垃圾将增加2到18倍不等。

绿色IT 技术已经成为十大IT关键技术之首,各个公司、学者为实现绿色 IT 需求进行了不懈努力,为实现绿色需求设计了多种体系结构和低能耗、低污染材料。然而,大部分电子设备的工作状态均依赖于其上运行的软件,软件的运行方式将直接影响硬件设备各种绿色指标的优劣。因此,除在硬件设备本身的材料上提高绿色程度外,必须对其上运行的软件进行相应处理,设计适应性的优化方法,以充分发挥硬件设备的绿色功效。

电子设备上运行的各种软件,由于其规模的不断增长,以及各种硬件体系结构的层出不穷,单独依靠程序员从源代码级进行绿色优化的难度越来越高。而且该方法适应性不强,人们迫切需要更低层次、系统化、自动化的优化方法。同时,软件复杂度的不断增长极大地提高了软件测试(通常占整个开发过程的 30%~50%)中资源和能源的消耗,据微软在新闻发布会上公布的数字显示,Windows8 在测试期间有超过10亿小时的使用和反馈。如果按每台个人计算机功耗为 200 W, Windows8 测试已经消耗了 2 亿度电,而且其测试过程仍未停止。因此,如何减少软件开发过程中资源和能源消耗也是实现绿色IT的重要方面。

早期的软件由于功能比较单一,逻辑相对简单,很多熟练的程序员能够凭借经验,使用较为低级的汇编语言进行编程,以获得较高质量的可执行程序。随着处理器芯片、存储芯片等关键设备制作工艺和性能的飞速发展,计算机系统得到广泛的普及,其功能越来越全面,运行的应用程序也越来越复杂,开发和调试的难度也将越来越大,传统的用低级语言进行编程的方式已经很难满足需求。大部分嵌入式程序均采用高级语言(如 C、Java 等)进行编写,然后再利用交叉编译器将该程序转换为对应平台的可执行目标程序。因此,编译器作为软件开发和语言转换的工具,不但能够结合具体的嵌入式系统硬件设备信息进行针对性的绿色优化,以指导最终的目标程序朝着绿色需求的方向生成,而且能够利用其在程序转换中对源程序的分析结果,提高错误检测的速度和定位精度,帮助程序员尽早发现和修改程序错误,减少软件开发过程中资源和能源的消耗。要系统化、自动化地对软件进行优化,必然离不开编译器的支持。

目标绿色编译器能够使得编译生成的软件以尽可能低的能耗、高的资源利用率和小的设备损耗正确地运行。由于硬件设备主要以超大规模集成电路为主,其能耗和设备损耗除与本身的材质相关外,与其工作时的温度也联系很大。一般情况下,设备工作时的温度越高,其能耗和设备损耗也将越大。而部件温度的提升常常是由于其持续处于激活状态的结果。因此,如果能够有效地调整各个部件进入激活状态的频度,使各个资源能够均衡地工作,对降低设备能耗和损耗将有重要作用。同时,在任务负载一定的情况下,均衡的工作方式要求循环使用各种资源,使得所有资源在该设备有效工作时间内均能获得充分利用,因而也间接提高了资源利用率,使得设备不至于因为某个频繁使用部件的损坏而导致大量正常可用资源的浪费。

绿色编译器能够帮助开发者快速准确地开发出满足预期功能需求的软件,以减少开发过程中资源和能源的耗损。这就要求该编译器能够快速发现和定位程序中的错误,使得软件开发者能够根据该提示信息找出其源程序甚至是其设计模型中的错误,从而缩短开发周期,节约开发资源。

方法面向存储系统的绿色编译优化方法

存储系统对计算机系统能耗及高效运行有着重要影响,随着绿色需求的日益显著,人们从体系结构上对存储系统特别是片上存储系统(如寄存器、缓存和主存)采取了各种绿色优化措施,如缓存行移位技术、段交换技术、只写回修改位技术、数据编码、耗损平均技术(wear-leveling)等,以降低能耗,提高使用寿命。为适应处理器的速度,减少处理器与存储器之间的速度差距,存储系统通常被分为多个层次。而对于外存甚至是主存,由于其离处理器较远,数据的加载和写回由专门的硬件电路控制,编译器难以发挥较大作用,其绿色指标的提升主要基于体系结构的改进。在存储系统的绿色优化中,编译器主要是针对寄存器、缓存、便签式内存(scratchpad memory,SPM)等离处理器较近的存储层次,根据其存储材料的读写特性进行相关优化,其总体优化结构主要在寄存器操作以及SPM存储单元的管理体现上。

面向新型处理器的绿色编译优化方法

处理器担负着计算机系统中所有的数据处理工作,传统的处理器为提高处理器精度和可靠性,通常设计了复杂的运算逻辑和可靠性保障策略,使得处理器的能耗通常占据系统总能耗的很大比重。因此,减少处理器能耗对降低系统总能耗具有重要意义。为降低处理器能耗,从纯编译器角度可以通过指令选择和指令调度,提高低能耗指令和低切换能耗的指令序列的执行频率。结合硬件则主要通过动态电压和频率缩放技术,尽可能降低处理器的电压和频率,以获得能耗的节约。但过度的电压和频率的缩放将会影响处理器的正确性,因此传统的处

理器电压和频率缩放总是控制在某个阈值之上,以保证处理器运行的正确性。随着计算机应用范围的不断扩大,计算机的很多应用领域已经不局限于精确的科学计算,某些应用如语音处理、图像处理、数据挖掘等,并不要求获得像数值计算一样非常精确的结果,处理器在处理这些应用时某些非关键点的程序错误并不会对最终结果产生很大影响。因此,一些研究者针对具体应用的特点,将处理器的研究重点逐渐从传统精确的处理器转为非绝对精确的低能耗处理器。这类的低能耗处理器主要有两种:随机处理器(stochastic processor,SP)和时序推测处理器(timing speculative processor,TSP)。

随机处理器主要是针对那些能够容忍一定错误的应用程序而设计的。该类处理器的主要思想是通过对程序正确性约束条件进行适当的放松,在保证不超过被执行程序错误容忍度的情况下,减少处理器中某些错误纠正逻辑,降低系统的能耗。对于随机处理器,其主要难点是如何将程序转换为另一个可以接受的低能耗的近似版本。有三种优化方案:第一种方法针对图像处理程序,利用分支合并技术,将某些控制分支的跳转语句从源程序中移除,使得所有线程均执行某条主程序路径。该方法可以使用硬件实现,也可以在编译时插入额外的分支合并语句来实现。分支合并技术由于减少了处理器分支预测的开销,从而能够有效地减少能耗。第二种方法主要是针对特定的稀疏线性代数问题,利用代数本身的特点将程序转换为个简化的近似版本,并只纠正那些严重影响程序输出结果的错误,通过计算量的减少达到降低处理器能耗的目的。第三种方法是将任意的程序转换为一个容错能力强的数值优化问题,以减少随机处理器出错时对程序结果的影响,提高随机处理器的有效性。

利用形式化推理技术说明了如何验证转换后程序是可接受的,为程序的近似转换提供了一定的保障机制。但由于针对随机处理器的程序转换复杂度比较高,大部分工作是通过程序员进行的。而人工转换程序适用性比较低,同时受程序员本身水平的限制,难以充分发挥随机处理器的功能。因此,在今后的研究中可以考虑人机交互式程序转换,以提高程序转换的效率。

时序推测处理器主要通过对处理器工作电压和频率的缩放达到降低功耗的目的。过度的电压频率缩放可能会引起时序错误,为弥补这些时序错误,时序推测处理器在传统处理器的基础上增加了额外的错误检测和纠正机制。这些额外的硬件设备虽然需要额外的能耗,但只要缩放的电压和频率适中,处理器出现时序错误的几率将很小,因而这些额外的能耗将小于电压频率缩放而节约的能耗,进而节约总能耗。

面向高绿色指标软件开发效率的编译辅助分析方法

软件测试和调试是软件开发的重要环节,也是一项开销巨大的工作。传统的人工测试技术不但要耗费大量的人力资源,还需要很长的测试和调试周期,约占整个软件开发过程的30%~50%,甚至更多,而且测试效率低下,并严重依赖于测试人员的个人经验,即使很简单的程序也可能由于个体思维习惯导致测试和调试的遗漏。因此,如何利用编译器提高自动化测试效率,给出足够准确的调试辅助信息是编译器研究的另一个不容忽视的方面。

对于自动测试工具,其最主要的工作之一是针对具体的待测程序设计出高效的测试用例。然而对于一般的测试用例,特别是针对白盒测试的用例,只有对源程序进行了全面的分析,才能找到合适的生成方案,生成尽可能少而高效的测试用例。作为程序转换的编译器,其在编译过程中对源程序的语法语义进行了充分的分析,能够为自动测试工具提供有关被测程序的丰富信息,因此对于提高测试效率,减少测试过程中对人员和资源的消耗具有天然的优势。

利用编译提高软件调试效率方面,研究的重点主要集中于在编译过程中给出足够友好的语法错误和不安全操作的位置信息,以帮助开发者快速定位和修改软件中可能存在的错误。许多主流编译器如GCC、Clang等,在错误警告信息的友好度和精确度上进行着不断的改进。其实,测试用例与错误警告信息定位具有相辅相成的关系,好的测试用例(即程序输入)可以帮助编译器缩小错误和警告信息的定位范围,提高其给出的信息精度;而编译器发现的程序可能出错位置,可以通过逆向分析生成对应的测试用例,以提高该测试用例的有效性。文献

提出了一种编译指导的支持错误跟踪的测试用例自动生成方法。该方法以编译器为依托,通过对源程序的语法和语义进行扩展,将测试需求很好地融入到源程序中参与分析,并利用代码生成器在生成目标代码的同时,根据相应的分析结果直接生成相应的测试用例。同时,利用编译器的语义分析,将源程序的行号信息融入到生成的测试用例中,使其能够在测试用例无法通过时为程序员尽快地定位出错位置,以提高程序开发的进度,从而减少不必要的开发资源的浪费,提高软件开发过程中的绿色指标。

本词条内容贡献者为:

王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所