麻省理工学院研究人员开发的一项新技术重新思考了硬件数据压缩,可释放计算机和移动设备所占用的更多内存,使其运行更快,并能同时执行更多任务。
数据压缩利用冗余数据来释放存储容量、提高计算速度,并带来其他好处。在当前的计算机系统中,与实际计算相比,访问主内存的成本非常高。因此,在内存中使用数据压缩有助于提升性能,因为它减少了程序从主内存获取数据的频率和数量。
现代计算机中的内存以固定大小的数据块管理和传输数据,而传统压缩技术必须基于这些数据块进行操作。然而,软件并不会自然地将其数据存储为固定大小的数据块。相反,它使用“对象”,即包含各种类型数据且大小可变的数据结构。因此,传统的硬件压缩技术处理对象的效果不佳。
麻省理工学院的研究人员在本周举行的ACM编程语言与操作系统架构支持国际会议上发表的一篇论文中,介绍了首个跨内存层级压缩对象的方法。这在减少内存占用的同时,提升了性能和效率。
程序员在使用Java、Python和Go等任何将数据存储和管理在对象中的现代编程语言进行编程时,无需更改代码即可从这项技术中受益。对消费者而言,他们将看到运行速度快得多的计算机,或能够以相同速度运行更多应用程序的计算机。由于每个应用程序占用的内存更少,其运行速度更快,因此设备可以在其分配的内存范围内支持更多应用程序。
在使用经过修改的Java虚拟机进行的实验中,与传统的基于缓存的方法相比,该技术压缩的数据量为两倍,并将内存占用减少了一半。
“我们的动机是尝试构建一种新的内存层级,使其能够进行基于对象的压缩,而不是缓存行压缩,因为这正是大多数现代编程语言管理数据的方式,”第一作者、计算机科学与人工智能实验室(CSAIL)的研究生蔡博安(Po-An Tsai)说。
“所有计算机系统都将从中受益,”共同作者、计算机科学与电气工程教授、CSAIL研究员丹尼尔·桑切斯(Daniel Sanchez)补充道,“程序运行得更快,是因为它们不再受内存带宽的瓶颈限制。”
研究人员在其先前的工作基础上进行了拓展,该工作重构了内存架构,以直接操作对象。传统架构以数据块的形式将数据存储在一个层级结构中,该层级由逐级变大、变慢的存储器组成,称为“缓存”。最近访问的数据块会上移至较小、较快的缓存中,而较旧的数据块则被移至较慢、较大的缓存中,最终回到主内存。虽然这种组织方式十分灵活,但代价高昂:访问内存时,每一级缓存都需要在其内容中搜索地址。
桑切斯说:“既然现代编程语言中数据管理的自然单位是对象,为什么不直接构建一个处理对象的内存层级呢?”
在去年十月发表的一篇论文中,研究人员详细介绍了一种名为Hotpads的系统,该系统将完整的对象紧密打包到分层级别中,即“pads”。这些级别完全驻留在高效的片上直接寻址存储器中,无需复杂的搜索。
随后,程序可以直接引用所有对象在pads层级结构中的位置。新分配的和最近被引用的对象,以及它们所指向的对象,都保留在较快的级别中。当较快的级别被填满时,系统会运行一个“驱逐”过程:保留最近被引用的对象,将较旧的对象下移至较慢的级别,并回收不再有用的对象以释放空间。随后更新每个对象中的指针,使其指向所有被移动对象的新位置。通过这种方式,程序访问对象的成本远低于在各级缓存中搜索。
在这项新研究中,研究人员设计了一种名为“Zippads”的技术,该技术利用Hotpads架构来压缩对象。对象最初位于较快的级别时是未压缩的。但当它们被驱逐至较慢的级别时,则会全部被压缩。随后,所有级别中的对象指针都指向这些压缩后的对象,这使得它们可以轻松调回较快的级别,并且能够比以往技术更紧凑地存储。
压缩算法随后高效地利用对象之间的冗余。该技术比以往的技术发现了更多的压缩机会,因为以往的技术仅限于在每个固定大小的数据块内查找冗余。该算法首先选取若干具有代表性的对象作为“基”对象。然后,在新的对象中,它只存储这些对象与具有代表性的基对象之间的差异数据。
卡内基梅隆大学电气与计算机工程助理教授布兰登·卢西亚(Brandon Lucia)赞扬了这项工作,认为其利用面向对象编程语言的特性,更好地压缩内存。“面向对象编程等抽象概念被加入系统中,是为了让编程更简单,但往往会在系统的性能或效率方面付出代价,”他说,“这项工作的有趣之处在于,它利用现有的对象抽象作为一种手段,使内存压缩更加有效,进而借助新颖的计算机架构特性,使系统运行更快、效率更高。”


