如何启用存内计算之探讨

存内计算就是在内部存储器里面直接进行运算操作,这是目前发展起来的AI芯片要克服内存墙的难题,突破成本、功耗、运行速度等实用化障碍。启用存内计算有以下方面需要注意:

如何启用PIM的障碍?

启用PIM会面临许多挑战。例如:PIM应用和软件的功能性;易编程性(接口和编译器/HW支持);系统支持:一致和虚拟内存;用于自适应调度、数据映射、访问/共享控制的运行时和编译系统;评估效益和可行性的基础工具和模型。我们可以一步一步来解决他们。

如何映射代码?

哪些操作应该在内存中执行,哪些操作应该在CPU中执行?指令必须被映射到它们最有效执行的计算单元。例如,内存密集型指令块可以在存储它们访问数据的内存栈逻辑层执行,而计算密集型指令块可以在主CPU上执行。程序开发人员可以在代码中手动进行这样的分配,但是如果全部交给程序员来做,工作量就太大了。因此,我们需要研究如何自动进行代码映射来减轻程序员的负担,而此类解决方案通常依赖于平台。最近的一项工作是检查基于编译器的机制,以决定在基于GPU的系统中以对GPU程序员透明的方式将代码部分卸载到PIM处理逻辑层。最近的另一项工作还研究了决定哪些GPU应用程序内核适合执行PM的系统级技术。

如何调度代码?

在PIM中何时调度代码执行(即何时值得将计算量转移到PIM核)呢?研究人员提出了PIM卸载候选对象动态调度的运行时机制,即决定是否实际卸载标记为可能被卸载到PIM引擎的代码的机制。研究人员为启用PIM的指令集开发了一种局部性的调度机制。对于基于GPU的系统,研究人员探索了编译时和运行时机制的组合,用于识别和动态调度PIM卸载候选对象。

如何映射数据?

如何将数据映射到不同的3D内存栈?在具有多个内存栈的GPU系统中,应用程序的数据分布在多个内存栈中,以最大限度地利用主GPU的带宽。然而,PIM操作的效率主要取决于卸载操作访问的数据是否位于相同的内存堆栈中。如何有效地映射数据极具挑战性,因为程序中不同的代码块和线程在程序执行期间的不同时间访问数据结构的不同部分。确定哪一部分内存被哪个代码块实例访问是困难的,并且要求程序员这样做会给程序员带来很大的负担。最近的一项工作的解决方法是,提出一种对程序员透明的数据映射机制,将数据放在与访问它的卸载代码相同的内存堆栈中。这种机制基于一个关键的观察,即卸载代码块的很大一部分(在我们的实验中占85%)显示出可重复的内存访问模式。

如何保持一致性?

缓存一致性是将PIM体系结构作为通用执行引擎的主要系统挑战,因为PIM处理逻辑可以修改处理的数据,而且CPU内核也可能需要这些数据。LazyPIM是一种新的一致性协议,它保持了PIM处理逻辑与CPU内核之间的缓存一致性,而无须为每次内存访问发送一致性请求。相反,LazyPIM通过让PIM处理逻辑投机推测获取一致性许可,然后向CPU发送压缩成批的一致性查询,以确定其推测性许可获取是否违反了一致性语义。由于这种“懒惰的”检查,LazyPIM获得了接近理想的一致性行为:使用 LazyPIM的PIM体系结构的性能和理想的PIM结构相比差异在5.5%之内。和以前最好的致性协议相比, LazyPIM能将片外数据传输量降低58.8%。

如何支持虚拟内存?

当应用程序需要访问主内存中的数据时,CPU必须首先执行地址转换,将数据的虚拟地址转换为主内存中的物理地址。如果翻译元数据在CPU的地址转换缓冲区(TLB)中不可用,那么CPU必须调用页表遍历器来执行长延迟的页表遍历,这涉及到对主内存的多次顺序读取,降低了应用程序的性能。减少页遍历开销的一个简单解决方案是使用PIM引擎执行页表遍历。这可以通过复制TLB的内容并将页遍历器移动到主内存中的PIM处理逻辑来实现。但这样做会增加虚拟内存的开销,因此研究人员开发了一种专门针对PIM地址转换的解决方案,作为内存中指针跟踪加速器IMPICA的一部分。IMPICA利用3D堆叠内存中可用的高带宽来遍历DRAM中的虚拟内存指针链,而无须在CPU的TLB中查找虚拟到物理地址的转换,也无须在CPU中使用页遍历器。IMPICA的主要思想是:(1)使用基于区域的页表,这是为PIM加速而优化的;(2)使用两个专门的引擎来解耦地址计算和内存访问。在三种常用的数据结构(链表、哈希表和二叉树)中,IMPICA分别将指针跟踪操作的性能提高了92%、29%和18%。在实际的数据库应用程序DBx1000上,IMPICA分别将事务吞吐量和响应时间提高了16%和13%。IMPICA还降低了整个系统的能耗,三种常用的数据结构能耗分别降低了41%、23%和10%,而DBx1000降低了6%。

如何为PIM设计数据结构?

当前具有许多CPU核的系统运行具有并发数据结构的应用程序,以实现高性能和可伸缩性,与顺序数据结构相比具有显著优势。目前,这种并发数据结构通常用于高度优化的服务器系统,其中高性能是至关重要的。为了在这样的多核系统中采用PIM,有必要开发专门为利用PIM而定制的并发数据结构。指针跟踪数据结构和争用数据结构需要仔细分析和设计,以利用3D堆叠存储器的高带宽和低延迟。首先,指针跟踪数据结构(如链表和跳转表)具有高度的内在并行性和低争用,但是PIM内核中的一个简单实现会受到难以预测的内存访问模式的影响。通过在3D堆叠的内存中组合和分区数据,可以充分利用这些数据结构固有的并行性。其次,争用数据结构(如FIFO队列)非常适合CPU缓存,因为它们具有高局部性。但是,当许多线程同时访问它们时,就会出现高争用。使用一种新的基于PIM的FIFO队列,可以提高它们在传统CPU系统上的性能。这个队列使用一个PIM内核来执行CPU内核请求的入队和出队操作。为了提高性能,PIM内核可以流水线的方式处理不同的CPU内核请求。

PIM仿真基础设施

为了方便PIM的采用,就必须对PIM的优点和缺点进行全面的评估。因此,实际应用中需要PIM仿真基础设施。Ramulator是一个灵活和可扩展的DRAM模拟器,可以为许多不同的内存标准和建议建模。SoftMC(Soft Memory Controller)是一个基于FPGA的测试平台,可以控制和测试为常用的双倍数据速率(DDR)接口设计的内存模块。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200224A0ACIG00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券