在传统的计算机中,微处理器安装在“封装”上,小型电路板的底部带有电引线栅格。该软件包卡入计算机的主板,数据通过引线在处理器和计算机的主存储库之间传输。
随着处理器晶体管数量的增加,处理器与主存储器之间相对较慢的连接已经成为提高计算机性能的主要障碍。因此,在过去几年中,芯片制造商已经开始将动态随机存取存储器或DRAM(传统上用于主存储器的存储器类型)放在芯片封装上。
使用该内存的自然方式是作为高容量缓存,快速,本地存储常用数据。但DRAM与通常用于片上高速缓存的内存类型根本不同,现有的高速缓存管理方案不能有效地使用它。
在最近的IEEE / ACM国际微体系结构研讨会上,来自麻省理工学院,英特尔和苏黎世联邦理工学院的研究人员提出了一种新的缓存管理方案,该方案可将封装内DRAM缓存的数据速率提高33%至50%。
“这种封装内DRAM的带宽可能比封装外DRAM高出五倍,”麻省理工学院计算机科学与人工智能实验室的博士后作者和新文章的第一作者向翔耀说。“但事实证明,以前的方案花费太多流量来访问元数据或在包内和包外DRAM之间移动数据,而不是真正访问数据,并且它们浪费了大量带宽。性能不是你能从中获得的最佳效果新技术。”
缓存哈希
通过“元数据”,Yu表示描述缓存中数据来源的数据。在现代计算机芯片中,当处理器需要特定数据块时,它将检查其本地缓存以查看数据是否已存在。高速缓存中的数据用主内存中的地址“标记”,从中获取数据; 标签是元数据。
典型的片上高速缓存可能足够容纳64,000个带有64,000个标签的数据项。显然,处理器不希望搜索它感兴趣的所有64,000个条目。因此,缓存系统通常使用称为“哈希表”的东西来组织数据。当处理器寻找具有特定标签的数据时,它首先将标签馈送到散列函数,散列函数以规定的方式处理它以产生新的数字。该数字指定数据表中的一个槽,这是处理器查找它感兴趣的项目的位置。
散列函数的要点是非常相似的输入产生非常不同的输出。这样,如果处理器严重依赖于来自窄范围地址的数据 - 例如,如果它在大图像的一个部分上执行复杂操作 - 则数据在整个缓存中间隔开,以便不会导致logjam在一个位置。
但是,散列函数可以为不同的输入生成相同的输出,如果它们必须像缓存方案那样处理各种可能的输入,则更有可能。因此,缓存的哈希表通常会在同一哈希索引下存储两个或三个数据项。但是,搜索给定标签的两个或三个项目比搜索64,000要好得多。
愚蠢的记忆
这就是DRAM和SRAM(标准高速缓存中使用的技术)之间的区别所在。对于它存储的每一位数据,SRAM使用六个晶体管。DRAM使用一个,这意味着它更节省空间。但SRAM具有一些内置处理能力,而DRAM则没有。如果处理器想要在SRAM缓存中搜索数据项,它会将标记发送到缓存。SRAM电路本身将标签与存储在相应散列位置的项目进行比较,如果匹配,则返回相关数据。
相比之下,DRAM不能做任何事情,只能传输请求的数据。因此,处理器将请求存储在给定散列位置的第一个标签,如果匹配,则发送对关联数据的第二个请求。如果它不匹配,它将请求第二个存储的标签,如果那不匹配,则第三个,依此类推,直到它找到它想要的数据或放弃并转到主存储器。
封装内的DRAM可能有很多带宽,但这个过程会浪费它。Yu和他的同事-Srinivas Devadas,麻省理工学院电子工程和计算机科学教授Edwin Sibley Webster教授; 英特尔的Christopher Hughes和Nadathur Satish; 苏黎世联邦理工学院的Onur Mutlu - 通过略微修改大多数现代芯片中的内存管理系统来避免所有元数据传输。
在计算机芯片上运行的任何程序都必须管理自己的内存使用,并且让程序就像它有自己的专用内存存储一样,通常很方便。但事实上,多个程序通常同时在同一芯片上运行,并且它们都在同时向主存储器发送数据。因此,芯片中的每个核心或处理单元通常具有将各个程序使用的虚拟地址映射到存储在主存储器中的数据的实际地址的表。
Yu和他的同事的新系统,被称为Banshee,为表中的每个条目添加了三位数据。一位表示该虚拟地址处的数据是否可以在DRAM缓存中找到,另外两位表示其相对于具有相同哈希索引的任何其他数据项的位置。
“在条目中,您需要拥有物理地址,您需要拥有虚拟地址,并且您还有其他一些数据,”Yu说。“那已经差不多100比特了。所以三个额外的比特是一个相当小的开销。”
这种方法存在一个问题,Banshee也必须解决这个问题。如果其中一个芯片的内核将数据项拉入DRAM缓存,则其他内核将不会知道它。每当其中任何一个核心更新缓存时,都会向所有芯片的核心发送消息,从而消耗大量的时间和带宽。因此Banshee引入了另一个称为标记缓冲区的小电路,其中任何给定的核心都可以记录它缓存的数据项的新位置。
由任何内核发送到DRAM高速缓存或主存储器的任何请求首先通过标记缓冲区,标记缓冲区检查所请求的标记是否是其位置已被重新映射的标记。只有当缓冲区填满时,Banshee才会通知所有芯片的核心,他们需要更新虚拟内存表。然后它清除缓冲区并重新开始。
缓冲区很小,只有5千字节,因此它的添加不会消耗太多有价值的片上空间。研究人员的模拟显示,与Banshee提供的带宽节省相比,每次内存访问一次额外地址查找所需的时间是微不足道的。