来源 | 悦智网
智库 | 云脑智库(CloudBrain-TT)
云圈 | 进“云脑智库微信群”,请加微信:15881101905,备注您的研究方向
声明 | 本号聚焦相关知识分享,内容观点不代表本号立场,可追溯内容均注明来源,若存在版权等问题,请联系(15881101905,微信同号)删除,谢谢
伏尔泰曾写道:“至善者,善之敌。”
这只是表述“完美主义并非总是美德”的众多说法之一。然而,如今的计算机则是坚定不移的完美主义者,这是因为即使是其输出结果中的罕见缺陷也可能造成高昂的代价,甚至带来灾难性的后果。例如,英特尔P5奔腾芯片中的一个漏洞曾致使该公司损失近5亿美元,尽管在90亿次计算中,它仅给出了一次略微不准确的答案。计算机超凡的稳定性使它们在处理许多任务时大有助益,尤其是我们易犯错误的普通人永远无法做好的那些工作。但是这一绝妙品质需要付出代价——能源。为了确保错误率极低,以至于我们可以放心地假设错误永远不会发生,计算机消耗了大量能源。这种几近完美的准确性在1971年时已成定局,当时首个商用微处理器——英特尔4004横空出世。在接下来的30年间,微处理器设计人员的主要目标是在维持该属性的同时,在每个芯片内填充更多的晶体管;能效并不在当时考虑范畴内。然而在今天,出于若干原因,能源使用已处于芯片设计人员思维的前沿和中心。首先,我们都爱不释手的移动计算机(如智能手机和平板电脑)中的处理器必须高效节能,以节省电池。超级计算机和数据中心内安装的芯片需要同样地节能,因为运行这些设施所需的电费通常能达到一年数百万美元。并且不同于1971年的情况,设计人员不可以再依靠半导体技术的进步,年复一年地大幅提升晶体管的能效。事实上,他们目前正面临着“黑硅”问题:尽管“摩尔定律”仍牢不可破,即每一代新的制造技术都不断地为芯片增加更多晶体管,但微处理器无法同时使用这些新增晶体管。其中仅有一部分可以在芯片变得无法冷却之前通电。因此芯片设计人员必须做出相应安排,在特定时刻让微处理器的许多的晶体管处于不通电的状态,即“变黑”——硅晶体世界的“轮流停电”。在这个能耗受限的时代,各路计算机科学家需要重新审视计算机投入能量的每项工作,包括无差错运行。在能源不是问题时,绝对的准确是极佳的特性。但是,现在是时候接受偶尔的疏忽了。牺牲准确性看起来可能是一个危险的策略。毕竟,当电脑犯错误时,结果可能是灾难性的。因此如果允许它们犯更多错误,是否会导致它们变得毫无用处?不见得。诀窍在于控制可能发生错误的时机。有时它们不会造成问题,因为我们今天使用计算机处理的许多事情并不要求严格的准确性。例如,在长途飞行途中用平板电脑看电影。当原始电影文件被压缩时,编码软件将每一帧上不重要的细节丢掉,生成一个小很多的文件。如果在平板电脑上运行的软件解码器在回放电影时弄乱了几个像素,你大概不会反对——尤其是如果这意味着在影片结束时会剩下更多的电量。这种情况不仅出现在媒体播放器上。对于许多种软件来说(例如语音识别、增强现实、机器学习、大数据分析以及游戏图形),完美的输出并非目标,事实上,为当前问题计算出完全正确的答案是不可能或不可行的。所有这一切所需的只是一个“近似”的答案。而当今天的完美主义计算机执行这些根本上属于近似的程序时,它们其实是在挥霍能源。要想抓住机遇,面对能源浪费现象,计算机设计人员可以根据需求,建造能够切换到节能模式的机器——尽管在某种程度上易于出错。比如说,这种机器可能会调低CPU电压,允许出现一些算数计算错误。降低动态随机访问存储器(DRAM)芯片的刷新率也可以节约能源,代价是产生少数不必要的位翻转。另外,如果允许出现一些通信错误,无线设备也可以减少对功率的需求。许多研究人员正在研究这类节能式硬件的改造。我们一直在探索程序员如何可以利用这类修改。为此,我们在西雅图华盛顿大学的研究小组已经开发了一种计算机语言,允许偶尔产生一些良性错误,同时阻止灾难性错误的发生。我们将其称之为“EnerJ”。这是我们为“近似计算”——一种新的能效提高方法作出的贡献。近似计算面临的主要困难是,即使是近似程序,有时也需要产生绝对准确的结果,比如说图片浏览器。尽管少数不正确的像素不会破坏一个大的图像,但该文件JPEG标题中的一个错误比特可能会导致输出结果毫无用处。
这种二分法对于许多种软件都很常见:一个程序的某些部分可以容许偶尔的错误或不精确,而其他部分必须始终精确执行,不出现任何错误。近似计算机需要同时支持两种模式,而近似程序必须在可行的情况下使用节能模式,同时避免导致灾难性故障的错误。但是一台计算机如何区别一个程序中可以容许近似结果的部分和不能容许的部分?至少在这一阶段,程序员需要通过使用一种可以提供区分机制的语言,指导计算机进行区分。原型语言EnerJ允许程序员将数据标记为“近似”或“精确”。请注意,我们在本文使用这些术语时有些不够严谨。这两类数据的差异可能仅在于数值精度——即用于保持一个值所需的比特数,或者表现在是否容易出现错误上:一个“近似”数据可能有较小但却不可忽视的概率成为“垃圾”数据,而一个“精确”数据可能实际上被视为无误差。我们一直在研究的一些硬件将这两种节能方法混合使用,在最不重要的比特内允许出现误差,同时确保最重要的比特始终正确。EnerJ是Java编程语言的一种扩展,但是其整体设计可应用于大多数需要程序员明确声明数据类型的语言。这类声明用于指示某一数据元是否旨在保持一个布尔值(真/假)、字节、32位整数、64位整数、32位浮点数,64位浮点数,或者其他各种可能性。每当程序员声明一个Java数据元时,他/她可以通过在声明前方书写“@Approx”,将其标记为“近似”。没有添加此类注释而声明的数据类型为“精确”数据。换言之,该系统仅在程序员特别允许的情况下使用近似值。举一个具体的例子,假设你想要编写某种代码,用于计算一个1000×1000像素的黑白图像的平均色度。你的代码可能从第一行的第一个像素开始,并标注其值。然后计算第一行的第二个像素,并将其值与第一个像素相加。然后以同样的方法处理第三个像素,以此类推,每次将像素的值添加到运算总和(将其存储在某个变量中)——我们称之为“TOTAL(总数)”。当计算完第一行的第1000个像素后,该程序开始计算第二行的像素,并以同样的方式继续,直到第1000行的第1000个像素。最后,它用总数除以100万来计算平均像素值。非常简单。除了变量“TOTAL”外,该代码需要两个计数变量:一个用于记录行数,另一个用于表示增加到总和的像素所在的列数。在列计数达到999后,代码复位到0并前进到下一行。当行和列的计数都达到999后,该程序可以除以100万,得出平均值。如果在这过程中,100万个像素中的一个有些偏移或没有正确地添加到总和中,那么没有太大关系:答案会受到影响,但不是很大。然而,如果一个行或列的计数没有正确地增加,该程序可能会显示一个错误,停止运算,甚至会进入一个死循环。而采用EnerJ,程序员只需在说明“TOTAL”和保持像素值的矩阵时,将其标记为“@Approx”即可。两个计数变量(我们称之为“I”和“J”)仍保持精确。有待建成的、可运行EnerJ程序的节能计算机将被允许不加区别地使用近似计算——前提是不影响该程序的精确数据。例如,该计算机可能在不可靠、低刷新率的DRAM中存储单个像素值,但它将不得不使用其正常可靠的内存部分存储I和J。或者,将像素值加入TOTAL的加法运算可以在较低电压下运行,因为这两个操作数都是近似值,但是增加两个计数变量的操作则必须在正常的电压下运行,以便它们总是得到精确计算。也就是说,仅仅通过在代码中对类型说明进行标注,程序员就指定了哪些地方可以使用近似存储和操作,以及哪些地方严禁使用近似。EnerJ还可以帮助程序员避免一些漏洞,以免近似计算损害需要保持精确的数据。具体来说,它禁止程序将近似数据放入精确的变量。继续来看我们的示例,以下赋值属于非法赋值:
由于I是精确值,EnerJ确保不可使用近似值进行计算。TOTAL是近似值,因此将其值复制到I中会在程序员希望保持精确、无错的那部分程序中引入近似值。而另一方面,相反的赋值则没有这一问题:像这样把精确值赋给近似值的操作不会违反精确保证原则,因为它们仅影响近似数据。通过在允许一类赋值的同时禁止其他赋值,EnerJ确保数据只在一个方向上移动。这种约束的作用就像一个单向阀:精确数据可以自由流动到近似程序的一部分,反之则不行。开发了可以执行单向数据移动(称为信息流跟踪)系统的研究人员对节能并不感兴趣。他们关注软件的安全性,希望其程序可以区分低完整性(可能遭到破坏的)数据与被视为具有高完整性的数据。信息流语言可以防止一种被称为SQL注入的计算机攻击。(结构化查询语言,简称SQL,用于数据库管理。)在这里,攻击者在系统等待一些简单输入数据时,为其提供了一个数据库命令。然后系统执行该命令——可能在此过程中造成巨大损害。信息流跟踪可以通过确保没有从用户流到SQL语句的输入,防止此类攻击。EnerJ借鉴了这一概念,避免精确的数据受到不精确或罕见错误的破坏。但是近似数据还有另一种方式可以影响精确数据:通过控制流语句。请看下面的代码:if (TOTAL>0.0)
I=1;
else
这里没有非法赋值,但近似值“TOTAL”仍影响了精确变量“I”。这种情况被称为“隐式信息流”,也必须予以避免。EnerJ可简单直接地防止隐式信息流:禁止任何控制流语句中出现近似条件。“TOTAL>0.0”属于近似的表达式,因为其中的一个操作数是近似值。因此编译器(这种软件可以将EnerJ语句转换成低级别代码,任何机器上都可以运行)在看到以“if”进行陈述的表达时,会显示一个错误。但是EnerJ在近似值和精确值之间执行的严格隔离在某些情况下可能过于局限。有时,程序产生的近似数据需要被移至程序的精确部分,例如,用于检查或输出。我们尝试使用一个可以读取条形码的智能手机应用程序,这个程序运用了多个近似容错图像分析算法,从一个QR代码的图片中产生了一连串比特。然后计算出“校验和”——一个用于确保一些其他数据块完整性的数值。校验和在检测错误时非常方便。这里有一个简单的例子:比方说你有100万个字节(一个字节由8个比特组成),希望以不完全精确的方式进行传送。你可能首先计算这100万字节的总和,然后丢掉答案中最不重要的8个比特。结果就是校验和,在发送数据后发送。单字节校验和现在可用于判断传输后的数据完整性。只需在远端重新计算校验和,并与已发送的值进行比较即可。即便数据只有一个比特在传输过程中损坏了,原始校验和与重新计算的校验和也不会匹配。对于条形码读取应用来说,我们希望保持校验和计算结果的精确性,以捕获因别处使用的近似计算而可能突然出现的错误。但是这需要近似计算(条形码读取算法)的输出流入精确计算——校验和中。通常情况下,这是不可能实现的。但是EnerJ提供了一个“应急出口”,其形式称为“背书”——一个标记表明程序员允许打破EnerJ执行的严格隔离。EnerJ的数据型注释、背书以及它们提供的隔离保证使其可以充分利用近似计算编写程序,同时保留足够的精确计算,以保持稳定性。这些特性让程序员可以放心地牺牲一些精度和严格的准确性,提高能源效率。正如程序员习惯于优化软件,以提高性能,EnerJ让他们通过优化来节约能源。
能节省多少能源呢?这一点很难说,因为还没有人建造运行EnerJ所需要的双模、节能计算机。但是我们的研究小组已编写了多个EnerJ程序,并在模拟环境中运行——模拟内存或中央处理中具有各种节能功能的硬件。根据程序类别以及模拟硬件试图降低能耗的努力程度,EnerJ可节省10%~40%的能耗。我们最新开发的计算机语言在这些试验中表现出色,这让我们感到非常高兴。同时,我们还惊喜地发现,许多种程序都有部分允许近似计算。EnerJ可以完美地适用到图像渲染和图像识别上。信号处理算法和3D游戏中的几何问题在应用EnerJ方面不太明显,但它们也可以很容易地拆分为近似和精确两类组件。事实上,当你拥有EnerJ或另一种近似计算“利器”时,任何程序都看起来“迎刃而解”了。我们现在需要一种切合实际的CPU设计,在运行EnerJ程序时可以节省能源。与我们在华盛顿大学的前同事哈迪•艾斯梅尔沙德(Hadi Esmaeilzadeh)和微软设计院的道格•伯格(Doug Burger)一道,我们已经开始设计能够在两个电压等级上运行的处理器。当某个程序需要无差错行为时,使用较高的电压。对于可以容许偶尔的小差错的计算来说,处理器切换至较低的电压,节省能源。同时,我们还在探索一些更加彻底变革的硬件设计,使之能够作为专用的近似协同处理器。为了推动近似计算的发展,程序员还需要一些工具,帮助他们理解牺牲精度换取节能过程中涉及的权衡取舍。编程语言的研究人员,包括那些我们小组内的此类人员,开始设计一些工具,类似于今天的调试器和性能分析器。有了这些工具,程序员可以回答以下问题:“如果我将媒体播放器的这一部分标记为‘近似’,那么视频文件的播放质量会发生什么变化?”正确的工具应该能让程序员节省大量能源,而用户则甚至不会注意到任何差别。事实上,由于如今的软件已经包含了不完善之处——表现为易出错的数据或近似输出,计算机为避免错误所耗费的能源(即使是最罕见的小错误)看起来也是越来越浪费。为了纠正这一局面,计算行业需要一些新的近似编程语言、新的近似硬件设计以及工具,帮助程序员理解如何最有效地利用它们。总之,它们应该帮助计算机变得更接近人类大脑,虽不完美,但却具有惊人的能源效率。作者:Adrian Sampson, Luis Ceze, Dan Grossman- The End -
版权声明:欢迎转发本号原创内容,转载和摘编需经本号授权并标注原作者和信息来源为云脑智库。本公众号目前所载内容为本公众号原创、网络转载或根据非密公开性信息资料编辑整理,相关内容仅供参考及学习交流使用。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请跟我们联系删除。我们致力于保护作者知识产权或作品版权,本公众号所载内容的知识产权或作品版权归原作者所有。本公众号拥有对此声明的最终解释权。
投稿/招聘/推广/合作/入群/赞助 请加微信:15881101905,备注关键词
“阅读是一种习惯,分享是一种美德,我们是一群专业、有态度的知识传播者
↓↓↓ 戳“阅读原文”,加入“知识星球”,发现更多精彩内容.
分享💬 点赞👍 在看❤️@以“三连”行动支持优质内容!