中文 英语

高但往往是不必要的一致性成本

缓存一致性的代价很高,对某些任务的好处很少,甚至是负面的。那么为什么它仍然被如此频繁地使用呢?

受欢迎程度

高速缓存一致性是提高芯片性能的常用技术,但随着通用处理器被高度专门化的加速器和其他处理元素所补充,有时甚至被其取代,这种技术正变得不那么有用。

虽然缓存一致性不会很快消失,但它越来越被视为保存长期存在的编程范式所必需的奢侈品。因此,只要有意义,架构就开始限制它的使用。

缓存有效地将内存的特定区域移动到更靠近处理器的位置,减少了处理数据的等待时间,提高了整体性能。的基本元素是连续的内存空间冯·诺依曼处理器架构这是一种相对便宜且易于实现的方法,即使在添加多个处理器时也是如此。但是,还有其他方法可以加快处理速度,对所有事情都使用通用处理器和缓存既不是最快的,也不是最有效的。


图1:简化的缓存一致性概念。来源:维基百科

缓存的管理也很复杂。这就产生了一个问题,因为现在内存空间的某些部分有多个副本。如果一个变量正被使用,并且可以被多个处理器操作,硬件必须确保所有这些处理器看到该变量的相同值。

在单个芯片的环境中,存在打包解决方案,可以适应大多数需求。然而,当需要跨芯片的一致性时,就变得更加困难了。最近,出现了一些标准,例如CCIX而且CXL,以确保来自多个供应商的系统之间的兼容性。

“Coherence是代理之间的一种合同,它说,‘我向你承诺,我将始终向你提供最新的数据,’”Arteris IP.“当你有很多人共享相同的数据集时,这是最重要的。平等同伴之间的一致性非常重要,而且不会消失。”

但是随着时间的推移,随着在设计中添加越来越多的处理器,与此解决方案相关的成本也增加了。Breker Verification Systems的执行总裁兼首席技术官Adnan Hamid表示:“异构的、数据流驱动的计算意味着对更多的数据进行更多的计算。“这些数据正在更多的网络上共享,同时管理安全和电力。它被可怜的冯·诺依曼先生和他的记忆瓶颈所阻碍。高性能系统不会丢失缓存,而是被迫在芯片、系统和数据中心内部和之间实现多级分布式缓存。”

许多新的编程范例都没有这个问题。内存——或者更准确地说,内存的内容——被提供给处理器,处理器在处理器上执行任务。在完成时,该内存的内容对任何其他想要使用它的人都是可用的。它简单、干净、快速、高效。

然而,改变需要时间。微软战略架构副总裁米林德•米塔尔表示:“处理的本质仍然是多个处理线程协作完成某些任务。赛灵思公司.“即使对于异构体系结构,一种看待整体处理范围的方法是,现在,与cpu上的同构通用处理(GP)线程不同,工作协作是在处理线程之间进行的,这些处理线程损害了GP线程和任务优化处理(TP)线程。”

当任务被很好地理解时,这是可以避免的。Arteris的Frank说:“在数据流引擎中,一致性不那么重要,因为你要把数据直接从一个加速器传送到另一个加速器。“如果你划分数据集,一致性就会碍事,因为这会花费额外的周期。您必须查找并提供更新信息。但如果你有一个通用的加速器类型,比如说,一个矢量引擎的平等进程的海洋,一致性是救命稻草,因为它允许你依赖数据的位置。”

这简化了设计过程。Xilinx的米塔尔表示:“这些协作线程之间总是需要共享数据结构。“缓存一致性在两个方面有帮助——易于实现共享数据结构的内存一致性(不需要显式的软件驱动一致性操作)或性能(当多个线程频繁访问一个数据结构时)。基于硬件的一致性解决方案存在可伸缩性和复杂性问题。”

对于特定的工作流,其中一些方案可能变得更加复杂。“我需要缓存是因为我需要增加带宽吗?”弗兰克问。“如果我必须向多个引擎提供相同的数据,但我不能从一个缓存中多次提供数据,我会将数据从主存复制到多个缓存副本中。现在,您必须考虑如何保证这些副本彼此保持一致。这就导致了一致性,因为现在你必须确保共享数据的多个cpu,或共享数据的多个加速器之间有一种方法来保持一致性。有时候,它真的就像彼此的副本一样简单。如果它是一次性使用,就不要为一致性而烦恼。确保数据一致性所需要的努力可能太昂贵了。”

当初始添加相干性时,每个节点的成本是相对线性的。“随着节点数量的增加,你必须确保每个人都有办法窥探或询问,并确保其他处理器的数据是一致和连贯的,”Frank补充道。“这意味着你需要每个区块之间的通信路径。此外,您需要确保协议中没有故障,例如竞态条件。您可能会检查数据是否在某个位置,在检查数据和获得响应之间,系统的状态发生了一些变化。您可能会得到过时的信息,因此这意味着您拥有的代理越多,出现竞态条件的机会就越多,这意味着您必须创建一个安全的协议。为了避免在同一时间访问每个代理,因为这在功率和时间上都很昂贵,您尝试在某个中心点(例如一个目录)做出决策,该目录记录系统中是否有多个缓存线副本,或者缓存线是否在代理之间共享,或者缓存线是否唯一,并且只有代理5上的一个副本。然后当你来要数据的时候,代理5会直接发给你。你的成本肯定是超线性增长的。”

必须充分考虑全部费用。公司创始人兼首席执行官西蒙•大卫曼表示:“在硅技术中实现一致性既复杂又昂贵治之软件.“当你使用多级缓存时,内存层次结构会变得越来越复杂,而且会越来越多地充满bug,消耗更大的电量。”

Breker的Hamid说:“只关心缓存一致性就够了的日子已经一去不复返了。“现在我们必须验证系统的一致性,关键脏数据不仅在很远的缓存中,而且很可能正在网络的某个地方传输。所有这些数据必须在跨网络安全防火墙的遍历中保持一致,同时各个子系统正在进行时钟和电压节流以进行电源管理。”

性能
添加缓存的主要原因是为了提高性能。“这要归功于Dave Patterson,他为绩效分析引入了著名的分析方法,”Frank说。“他做了所有的基础工作,以便就建造什么做出明智的决定。这是艺术与科学的结合。你需要理解你要做什么,但你真的必须看看算法要做什么。然后,您可以分析数据流和执行序列的算法。你要确保你能把东西分成不同的区域。当您确定了流程模式之后,就可以开始构建模型了。根据经验和粗略的计算,您提出了一个体系结构。然后你用模型来验证你的假设。”

其中涉及多少艺术?Imperas的Davidmann警告说:“你可以对性能进行一些计算,但我们永远无法对缓存子系统的细节进行建模。”“我们可以从功能的角度考虑,但不能从性能的角度考虑。我们只能提供近似值。例如,使用指令精确模型时,不需要对指令管道建模,因此不知道内存访问的顺序。这可能是因为预取、分支预测和推测执行等原因。所有这些要求的指令和数据获取都是无序的。每一个都可以改变缓存中的数据。它们可能永远不会真正退役,或者可能被丢弃。所以你可能会看到对缓存的访问不遵循程序流程。”

为了获得更准确的视图,你必须准备做更多的工作。弗兰克说:“你可以做出关于数据放置位置、如何在内存中组织数据、在哪里处理数据以及如何处理数据的明智决定。”例如,你可能会发现,有些数据是共享的,但很少更新,有些数据是从一个引擎传递到另一个引擎。有时芯片上有足够的内存,所以你可以将数据保存在芯片上,或者如果你必须将数据发送到芯片外,你必须弄清楚是否有足够的带宽。”

一致性的未来
未来的一致性会是什么样子?Xilinx的米塔尔表示:“我们的观点是,缓存一致性仍然是可取的。“然而,硬件一致性领域将仅限于小型机箱内的双插座和加速器或内存扩展解决方案。另外,硬件一致性要求将仅限于数据结构的子集。数据共享将通过部分数据的硬件一致性和通过软件一致性模型共享的其他数据的组合来实现。”

软件一致性受到越来越多的关注。“软件可以控制一致性,”Davidmann说。“你可以使用指令来刷新缓存,而不是用硬件来完成。例如,您可以延迟写入内存。已经做到这一点的解决方案具有很好的扩展性。当你观察现代处理器架构时,它们有软件控制的能力。RISC -V有关于原子性的指令。您可以锁定区域。也许你仍然需要某种程度的一致性,但趋势似乎是在软件方面可以做得更多。”

这需要一种不同的思维方式。“未来你将如何为加速器编程?弗兰克问。“你是否制作了像第一代gpu那样连接在一起的硬连线引擎?还是构建具有自己指令集的可编程引擎?如果必须单独对这些引擎进行编程,则需要将这些引擎与数据流连接起来,每个引擎执行特定的任务。任务是新的指令。你构建了指令,你仍然在编程,就好像它是一个连续的执行。但是编译器会根据你给它的提示来计算,这些提示描述数据流,如何划分和调度你的算法。你必须做完整的系统分析来理解数据流,理解你的需求,何时数据必须对哪个代理可见,以及这些数据和可见性有多少是可预测的。”

这使得一致性在某些应用中不那么有用。“如今,主机间的数据共享是通过利用远程直接内存访问(RDMA)或消息传递来复制数据的库实现的,”Mittal说。“未来,跨主机的数据共享可能包括对主机间数据使用加载/存储访问的选项,有或没有硬件一致性。硬件一致性可能会限制共享数据结构的大小。另一个可能发生的演变是向加速器中处理线程的无驱动上下文管理(任务优化处理)发展,类似于cpu上GP线程的上下文管理。”

随着任务被越来越多地理解,并且对架构进行了微调,数据流变得更可预测,一致性也可以更有针对性。现代机器学习架构表明,它对向量矩阵乘法等任务几乎没有增加价值。

但所有系统的某些部分仍将不可预测。弗兰克说:“首先要考虑的通常是如何从芯片上获取数据。“这意味着你要考虑你的整体内存带宽,你的接口,你必须支持的内存足迹。这定义了您的子系统决策。在此基础上,你将进一步研究你的编程引擎,并询问是否需要缓存,因为你可能拥有可重用的大量数据。”

米塔尔说:“保持设计复杂性的可管理性和接口的性能通常会将硬件一致性的范围限制在少数代理上。”

结论
对速度的需求要求内存更接近处理,而这就需要缓存。通用编程范式和单个处理器在性能方面的失败,要求靠近每个处理器的缓存之间保持一致性。但是这个解决方案太贵了,除非真的需要,否则不能使用。值得庆幸的是,随着许多任务变得更加面向数据,而不是控制主导,系统中的数据流可以更好地理解和处理。在某些情况下,软件可以比硬件更有效地管理它。在其他情况下,架构可以确保永远不需要它。



3评论

伯纳德 说:

好文章!

哈奇克·萨哈扬(格罗夫公司) 说:

谢谢你写了一篇有趣的文章。

环球查克 说:

好文章! !

留下回复


(注:此名称将公开显示)

Baidu