ARM V8A体系结构-第十四章 多核处理器

概述

ARMv8-A体系结构为包含多个处理元素的系统提供了高水平的支持。Cortex-A57MPCore和Cortex-A53MPCore处理器等ARM多核处理器可以包含一到四个核。使用Cortex-A57或Cortex-A53处理器的系统几乎总是以这种方式实现的。多核处理器可能包含多个能够独立执行指令的核心,这些核心可以被视为单个单元或集群。ARM多核技术使集群中的四个组件核中的任何一个在不使用时都可以关闭以节省电源,例如当设备轻载或处于待机模式时。当需要更高的性能时,每个处理器都在使用以满足需求,同时仍在共享工作负载以尽可能降低功耗。
多处理可以定义为在包含两个或多个内核的单个设备内同时运行两个或多个指令序列。它现在是一种广泛采用的技术,既适用于通用应用处理器的系统,也适用于传统上被定义为嵌入式系统的领域。
多核系统的总体能耗可以显著低于基于单处理器核心的系统。多个内核可以更快地完成执行,因此系统的某些元素可能会在更长时间内完全断电。或者,具有多个内核的系统可能能够以比单个处理器实现相同吞吐量所需的频率更低的频率运行。较低的功率硅工艺或较低的电源电压可以降低功耗和能耗。大多数现有系统不允许单独改变磁芯的频率。然而,每个核心都可以动态时钟选通,从而提供额外的电源和节能。
拥有多个核供我们使用也可以为系统配置提供更多选项。例如,您可能有一个使用独立内核的系统,一个用于处理硬实时需求,另一个用于要求高、不间断性能的应用程序。这些可以整合成一个单一的多处理器系统。多核设备也可能比单核设备更灵敏。当中断分布在多个核心之间时,有多个核心可用于响应中断,每个核心需要服务的中断更少。多核还可以使重要的后台进程与重要但不相关的前台进程同时进行。

1、多核系统

我们可以区分包含以下内容的系统:

  • 包含单个内核的单个处理器
  • 一种多核处理器,如Cortex-A53,具有多个能够独立执行指令的核心,可以被系统设计者或从应用层提取底层资源的操作系统从外部视为单个单元或集群
  • 多个集群(如第14-8页图14-1所示),其中每个集群包含多个核心

1.1 确定代码在哪个内核上运行

一些软件操作取决于代码在哪个内核上运行。例如,全局初始化通常由在单个内核上运行的代码执行,然后在所有内核上执行本地初始化。
多处理器关联寄存器(MPIDR_EL1)使软件能够确定它在集群内和具有多个集群的系统中的哪个核心上执行,并确定它在哪个核心上和哪个集群中执行。
某些处理器配置中的U位表示这是单核集群还是多核集群。关联字段给出了核心相对于其他核心位置的分层描述。通常,关联0是集群内的核心ID,关联1是集群ID。
在EL1上运行的软件可能在虚拟机管理程序管理的虚拟机内运行。为了配置虚拟机,EL2或EL3可以在运行时将MPIDR_EL1设置为不同的值,以便特定虚拟机看到每个虚拟核心的一致、唯一的值。虚拟核和物理核之间的关系由虚拟机监控程序控制,并且可能会随着时间的推移而改变。
MIPDR_EL3包含每个物理核心的不可更改ID。没有两个内核共享相同的MPIDR_EL3值。

1.2 对称多处理器

对称多处理(SMP)是一种软件体系结构,可动态确定各个核心的角色。群集中的每个核心都有相同的内存和共享硬件视图。任何应用程序、进程或任务都可以在任何内核上运行,操作系统调度器可以在内核之间动态迁移任务,以实现最佳的系统负载。多线程应用程序可以同时在多个内核上运行。操作系统可以对应用程序隐藏很多复杂性。
在描述SMP操作时,我们使用术语内核来表示操作系统中包含异常处理程序、设备驱动程序以及其他资源和进程管理代码的部分。我们还假设存在一个任务调度器,该调度器通常使用定时器中断来调用。调度器负责在多个任务之间对内核上的可用周期进行时间切片,动态确定各个任务的优先级,并决定下一步运行哪个任务。
线程是在同一进程空间中执行的独立任务,它使应用程序的不同部分能够在不同的内核上并行执行。它们还允许应用程序的一部分在另一部分等待资源时继续执行。通常,一个进程中的所有线程都共享多个全局资源(包括相同的内存映射和对任何打开的文件和资源句柄的访问)。线程也有自己的本地资源,包括自己的堆栈和寄存器使用情况,它们由内核在上下文开关上保存和恢复。然而,这些资源是本地的这一事实并不意味着任何线程的本地资源都能保证不被其他线程错误访问。线程是单独调度的,即使在单个进程中,线程也可以具有不同的优先级。
支持SMP的操作系统为应用程序提供了可用核心资源的抽象视图。多个应用程序可以在SMP系统中并发运行,无需重新编译或更改源代码。
传统的多任务操作系统使系统能够在单核或多核处理器中同时执行多个任务或活动。在多核系统中,我们可以实现真正的并发性,多个任务实际上在不同的核上同时并行运行。操作系统负责管理这些任务在可用内核中的分布。
通常,OS任务调度器可以跨系统中的可用内核分发任务。此功能称为负载平衡,旨在获得更好的性能或节能,甚至两者兼而有之。例如,对于某些类型的工作负载,如果将构成工作负载的任务安排在较少的内核上,则可以实现节能。这将允许更多的资源在更长时间内闲置,从而节约能源。
在其他情况下,如果任务分布在更多的核心上,工作负载的性能可能会提高。与使用更少的内核相比,这些任务可以更快地向前推进,而不会相互干扰。在另一种情况下,与在更高频率下运行更少的内核相比,在更多内核上以更低的频率运行任务可能是值得的。这样做可以在节能和性能之间进行更好的权衡。
SMP系统中的调度器可以动态地重新设置任务优先级。这种动态任务优先级安排允许在当前任务休眠时运行其他任务。例如,在Linux中,性能受处理器活动约束的任务的优先级会降低,而性能受I/O活动限制的任务的优先级会降低。I/O绑定进程会中断计算绑定进程,这样它就可以启动I/O操作,然后返回睡眠状态,处理器可以在I/O操作完成时执行计算绑定代码。
中断处理也可以跨内核进行负载平衡。这有助于提高性能或节约能源。在内核之间平衡中断或为特定类型的中断保留内核可以减少中断延迟。这还可能导致缓存使用减少,从而有助于提高性能。
使用更少的内核来处理中断可能会导致更多资源长时间闲置,从而以降低性能为代价实现节能。Linux内核不支持自动中断负载平衡。然而,内核提供了改变中断与特定内核绑定的机制。还有一些开源项目,比如irqbalance(https://github.com/Irqbalance/irqbalance)使用这些机制在可用的内核中安排中断的传播。irqbalance了解系统属性,例如共享缓存层次结构(哪些内核具有公共缓存)和power domain布局(哪些内核可以独立断电)。然后,它可以确定到核心绑定的最佳中断。
根据定义,SMP系统在集群中的核心之间具有共享内存。为了保持应用软件所需的抽象级别,硬件必须为您提供一致且连贯的内存视图。在没有任何明确的软件一致性管理的情况下,对共享内存区域的更改必须对所有内核可见,尽管需要诸如屏障之类的同步指令来确保以正确的顺序查看更新。同样,内核或应用程序内存映射的任何更新(例如,由于请求分页、分配新内存或将设备映射到当前虚拟地址空间)都必须一致地呈现给所有内核。

1.3 Timers

支持SMP操作的操作系统内核通常有一个任务调度器,负责在多个任务之间对内核上的可用周期进行时间切片。它动态地确定单个任务的优先级,并决定下一步在每个核心上运行哪个任务。为了使每个核心上的活动任务的执行周期性地中断,调度器通常需要一个计时器,以便有机会选择不同的任务进行。
当所有核心竞争同一关键资源时,可能会出现问题。每个内核都运行调度器来决定它应该执行哪个任务,并以固定的时间间隔执行。内核调度器代码需要使用一些共享数据,例如任务列表,可以通过排除(由互斥提供)防止并发访问。互斥锁只允许一个内核在任何时候有效地运行调度程序。
系统计时器体系结构描述了一个公共系统计数器,每个内核最多提供四个计时器通道。该系统计数器应处于固定的时钟频率。有安全和非安全的物理计时器,以及两个用于虚拟化目的的计时器。每个通道都有一个比较器,它与系统范围内的64位计数进行比较,该计数从零开始递增。您可以配置定时器,以便在计数大于或等于编程的比较器值时生成中断。
虽然系统计时器必须具有固定的频率(通常以MHz为单位),但允许不同的更新粒度。这意味着,在每一个时钟滴答声中,您可以以相应降低的速率,每10或100个周期,将计时器增加较大的数量,例如10或100,而不是将计数增加1。这会提供相同的有效频率,但会降低更新粒度。这对于实现低功耗状态非常有用。
CNTFRQ_EL0寄存器报告系统计时器的频率。
一个常见的误解是CNTFRQ_EL0由所有内核共享。只有寄存器是每个核心的,然后仅从固件的角度来看:所有其他软件都应该看到该寄存器已初始化为所有核心上的正确公共值。然而,计数器频率是全局的,对于所有内核都是固定的。CNTFRQ_EL0为引导ROM或固件提供了一种方便的方式,告诉其他软件全局计数器频率是多少,但不控制硬件行为的任何方面。
CNTPCT_EL0寄存器报告当前计数值。CNTKCTL_EL1控制EL0是否可以访问系统计时器。
要配置计时器,请完成以下步骤:

  1. 将比较器值写入64位寄存器CNTP_CVAL_EL0
  2. 在CNTP_CTL_EL0中启用计数器和中断生成
  3. 轮询CTP_CTL_EL0以报告EL0定时器中断的原始状态
    可以将系统计时器用作倒计时计时器。在这种情况下,所需的计数被写入32位CNTP_TVAL_EL0寄存器。硬件计算正确的CNTP_CVAL_EL0值。

1.4 同步

在SMP系统中,在任何特定时间,数据访问必须经常限制为一个修饰符。对于外围设备来说,这可能是真的,但对于由多个线程或进程访问的全局变量和数据结构来说,也是真的。保护这种共享资源通常是通过一种被称为互斥的方法。在多核系统中,可以使用自旋锁来测试和设置其值,自旋锁实际上是一个原子不可分割机制的共享标志。ARM体系结构提供了三条与独占访问相关的指令,以及这些指令的变体,它们对字节、半字、字或双字大小的数据进行操作。这些指令依赖于内核或内存系统标记特定地址的能力,以便该内核使用独占访问监视器进行独占访问监控。这些指令在多核系统中很常见,但在单核系统中也有,用于实现在同一核上运行的线程之间的同步操作。
A64指令集具有实现此类同步功能的指令:

  • Load Exclusive (LDXR): LDXR W|Xt, [Xn]
  • Store Exclusive (STXR): STXR Ws, W|Xt, [Xn] 其中Ws表示存储是否成功完成。0=成功。
  • 清除独占访问监视器(CLREX)用于清除本地独占监视器的状态

LDXR执行内存加载,但也标记要监控的物理地址,以供该内核独占访问。STXR执行有条件存储到内存,只有当目标位置被标记为被该内核监视以进行独占访问时,才会成功。如果存储未成功,此指令在通用寄存器Ws中返回非零,如果存储成功,则返回值0。在汇编程序语法中,它总是被指定为W寄存器,也就是说,不是X寄存器。此外,STXR会清除独占标签。
Load exclusive(加载独占)和store exclusive(存储独占)操作仅保证对映射了以下所有属性的正常内存起作用:

  • 内部或外部可共享
  • 内部写回
  • 外部写回
  • 读写分配提示
  • 不是暂时的

互斥锁或自旋锁可用于控制对外围设备的访问。锁的位置应该在正常的RAM中。您不能使用加载或存储独占来访问外围设备本身。
每个核心只能标记一个地址。独占监视器不会阻止另一个内核或线程读取或写入被监视的位置,只会监视自LDXR之后是否已写入该位置。
尽管体系结构和硬件支持独占访问的实现,但它们依赖于程序员执行正确的软件行为。互斥体只是一个标志,独占访问机制使该标志能够以原子方式访问。任何访问该标志的线程或程序都可以知道该标志设置正确。然而,互斥体控制的实际资源仍然可以被行为不正确的软件直接访问。类似地,用于存储互斥对象的内存没有特殊属性。当独占访问序列完成时,它只是内存中的另一段数据。此外,在编写使用互斥来保护资源的代码时,理解弱序内存模型至关重要。例如,如果没有正确使用屏障和其他内存排序注意事项,推测可能意味着在授予互斥之前加载了数据,或者在更新关键资源之前释放了互斥。有关内存排序注意事项的更多信息,请参阅第13章内存排序。

1.5 非对称处理器

非对称多处理(AMP)系统使您能够静态地将单个角色分配给集群中的一个核心,这样,实际上,您有单独的核心,每个核心在每个集群中执行单独的作业。这被称为功能分发软件体系结构,通常意味着在各个内核上运行一个单独的操作系统。在您看来,该系统可能是一个单核心系统,具有特定关键系统服务的专用加速器。AMP不指任务或中断与特定核心相关的系统。
在AMP系统中,每个任务都可以有不同的内存视图,高负载的内核无法将工作传递给低负载的内核。在这样的系统中,不需要硬件缓存一致性,尽管通常存在通过共享资源在核心之间进行通信的机制,可能需要专用硬件。第14-10页缓存一致性中描述的系统可以帮助减少与系统间共享数据相关的开销。使用多核处理器实现AMP系统的原因可能包括安全性、保证满足实时截止日期的要求,或者因为单个核专用于执行特定任务。有些系统同时具有SMP和AMP功能。这意味着有两个或两个以上的内核运行SMP操作系统,但该系统具有不作为SMP系统一部分运行的附加元件。SMP子系统可被视为AMP系统中的一个元件。缓存一致性在SMP核心之间实现,但不一定在系统内的SMP核心和AMP元件之间实现。通过这种方式,可以在同一集群中实现独立的子系统。构建AMP系统是完全可能的(也是正常的),其中单个内核运行不同的操作系统(称为多操作系统)。
如果需要在这些独立的核心之间进行同步,则可以通过消息传递通信协议(例如,多核通信协会API(MCAPI))提供同步。这些可以通过使用共享内存传递数据包和使用软件触发中断来实现所谓的门铃机制来实现。

1.6 异构多处理器

异构多处理(HMP)一词在许多不同的环境中都有应用。在描述由不同类型的处理器组成的系统时,通常会将其与AMP混为一谈,例如多核ARM应用处理器和特定于应用程序的处理器(例如基带控制器芯片或音频编解码器芯片)。ARM使用HMP来表示由应用处理器集群组成的系统,这些应用处理器的指令集体系结构100%相同,但微体系结构非常不同。所有处理器都是完全缓存一致的,并且是同一一致性域的一部分。
ARM V8A体系结构-第十四章 多核处理器_第1张图片

1.7 专用监控系统

典型的多核系统可能包括多个专用监视器。每个核心都有自己的本地监控器,还有一个或多个全局监控器。翻译表项的可共享和可缓存属性与专用加载或存储指令使用的位置有关,决定使用哪个专用监视器。在硬件方面,核心包括一个名为本地监视器的设备。这个监视器观察核心。当内核执行独占负载访问时,它会在本地监视器中记录这一事实。当它执行独占存储时,它会检查是否执行了以前的独占加载,如果不是这样,则会使独占存储失败。该体系结构使各个实现能够确定监视器执行的检查级别。内核一次只能标记一个物理地址。
每次异常返回时,即执行ERET指令时,本地独占监视器都会被清除。在Linux内核中,多个任务在EL1的内核上下文中运行,可以在没有异常返回的情况下进行上下文切换。只有当我们在相关内核任务的上下文中返回到用户空间线程时,我们才会执行异常返回。这与ARMv7体系结构不同,在ARMv7体系结构中,内核任务调度器必须明确清除每个任务开关上的独占访问监视器。重置本地独占监控器是否也重置全局独占监控器由实现定义。当用于独占访问的位置被标记为不可共享时,即仅在同一个内核上运行的线程,将使用本地监视器。本地监视器还可以处理访问被标记为内部可共享的情况,例如,一个互斥锁保护可共享域内任何核心上运行的SMP线程之间共享的资源。对于运行在不同非一致内核上的线程,互斥锁位置被标记为正常、不可缓存,并且需要系统中的全局访问监视器。
系统可能不包括全局监视器,或者全局监视器可能仅适用于某些地址区域。如果对系统中不存在合适监控器的位置执行独占访问,则会发生什么,这是实现定义的。以下是一些允许的选项:

  • 该指令生成一个外部中止
  • 该指令生成一个MMU fault
  • 该指令被视为NOP
  • 独占指令被视为标准LDR/STR指令,存储独占指令的结果寄存器中的值变得未知

独占保留颗粒(ERG)是独占监视器的粒度。其大小由实现定义,但通常是一条缓存线。它给出了地址之间的最小间距,以便监视器区分它们。在一个ERG中放置两个互斥体可能会导致误判,对其中一个互斥体执行str指令会清除这两个互斥体的独占标记。这并不妨碍架构正确的软件正常运行,但可能会降低效率。特定内核上独占监视器的ERG大小可以从缓存类型寄存器CTR_EL0中读取。

2、缓存一致性

第11章缓存只考虑单个处理器中缓存的影响。Cortex-A53和Cortex-A57处理器支持集群中不同内核之间的一致性管理。这需要使用正确的可共享属性标记地址区域。这些处理器允许构建包含多核集群的系统,集群之间共享的数据可以保持一致性。这种系统级一致性需要缓存一致性互连,例如ARM CCI-400,它实现了AMBA 4 ACE总线规范。见图14-2。
ARM V8A体系结构-第十四章 多核处理器_第2张图片
系统中的一致性支持取决于硬件设计决策,并且存在许多可能的配置。例如,一致性只能在单个集群中得到支持。
一个双集群大小核系统是可能的,或者内域包含簇,外域包含其他簇的多簇系统是可能的。了解更多关于大小核的信息,见第16章。
除了维护缓存之间数据一致性的硬件之外,还必须能够将一个内核上运行的代码执行的缓存维护活动广播到系统的其他部分。存在在重置时采样的硬件配置信号,这些信号控制是否广播内部或外部或两个缓存维护操作,以及是否广播系统屏障指令。AMBA 4 ACE协议允许向其他主设备发送屏障信号,从而维持维护和一致性操作的顺序。互连逻辑可能需要通过启动代码进行初始化。软件必须通过创建适当的翻译表条目来定义哪一组主机将使用哪一个地址区域,即哪些其他主机共享此地址。对于普通的可缓存区域,这意味着将shareable属性设置为不可共享、内部可共享或外部可共享。对于不可缓存的区域,将忽略shareable属性。
在多核系统中,不可能知道一个特定的核在其缓存中是否有一条覆盖特定地址的线(尤其是在互连具有缓存的情况下,如CCN-50x)。维护可能需要广播到互连。这意味着,一个内核上的软件可以对当前可能存储在保存地址的另一个内核的数据缓存中的地址发出缓存清除或失效操作。当如图14-3所示广播维护操作时,该操作由特定可共享性域中的所有核心执行。

ARM V8A体系结构-第十四章 多核处理器_第3张图片
SMP操作系统通常依赖于能够广播缓存和TLB维护操作。考虑一下外部DMA引擎能够修改外部内存内容的情况。在特定内核上运行的SMP操作系统不知道哪个内核有哪些数据。它只需要地址范围在集群中的任何位置失效。如果没有广播操作,操作系统必须在每个内核上本地发出清除或失效操作。DSB屏障指令使内核等待其发出的广播操作完成。屏障不会强制广播接收到的操作完成。有关屏障指令的更多信息,请参阅第13章内存排序。
表14-1列出了第11章中描述的缓存维护操作,以及它们是否被广播。
ARM V8A体系结构-第十四章 多核处理器_第4张图片
a:如果设置了HCR/HCR_EL2 FB位,则在非安全EL1中广播,覆盖正常行为。当从非安全域执行时,该位导致在内部可共享域内广播以下指令:EL1:TLBI VMALLE1、TLBI VAE1、TLBI ASIDE1、TLBI VAAE1、TLBI VALE1、TLBI VAALE1、IC IALLU。
b:由存储区域的可共享性决定的广播

对于IC指令,即指令缓存维护操作,is表示该功能适用于内部共享域内的所有指令缓存。

3、一个集群中的多核缓存一致性

一致性意味着确保系统中的所有处理器或总线主控器对共享内存有相同的看法。这意味着对一个核心缓存中的数据所做的更改对其他核心是可见的,这使得核心不可能看到过时或旧的数据副本。这可以通过简单地不缓存来解决,即禁用共享内存位置的缓存,但这通常会带来性能的浪费。

软件管理的一致性
软件管理的一致性是处理数据共享的一种更常见的方式。数据是缓存的,但软件(通常是设备驱动程序)必须清除脏数据或使缓存中的旧数据无效。这需要时间,增加了软件的复杂性,并且在共享率较高时会降低性能

硬件管理的一致性
硬件保持集群内1级数据缓存之间的一致性。内核在通电时自动参与一致性方案,并启用其D缓存和MMU,地址标记为一致。然而,这种缓存一致性逻辑不能保持数据缓存和指令缓存之间的一致性。在ARMv8-A体系结构和相关实现中,存在硬件管理的一致性方案。这些可确保在硬件一致性系统中标记为可共享的任何数据具有该可共享性域中所有内核和总线主节点看到的相同值。这为互连和集群增加了一些硬件复杂性,但极大地简化了软件和仅使用软件一致性而不可能实现的应用程序。

缓存一致性方案有多种标准操作方式。ARMv8处理器使用MOESI协议。ARMv8处理器也可以连接到AMBA 5-CHI互连,其缓存一致性协议类似于(但不完全相同)MOESI。
根据正在使用的协议,SCU使用以下属性之一标记缓存中的每一行:M(已修改)、O(已拥有)、E(独占)、S(共享)或I(无效)。以下是对这些问题的描述:

  • Modified:缓存线的最新版本在此缓存中。其他缓存中不存在该内存位置的其他副本。缓存线的内容不再与主内存一致。
  • Owned:这描述了一条脏线,可能位于多个缓存中。缓存线保存数据的最新正确副本。只有一个核心可以保存数据。其他内核可以将数据保持在共享状态。
  • Exclusive:缓存线存在于该缓存中,并与主内存保持一致。其他缓存中不存在该内存位置的其他副本。
  • Shared:缓存线存在于该缓存中,并且不一定与内存一致,因为Owned的定义允许将脏线复制到共享线中。然而,它将拥有最新版本的数据。它的副本也可以存在于相干方案中的其他缓存中。
  • Invalid:缓存线无效

协议的实施需要满足以下规则:

  • 只有当缓存线处于修改或独占状态时,才能执行写操作。如果它处于共享状态,则必须首先使所有其他缓存副本无效。写操作会将行设置到修改状态。
  • 缓存可以随时丢弃共享线,将其更改为无效状态。首先写回修改过的行。
  • 如果缓存中的某一行处于修改状态,则从系统中的其他缓存读取的数据将从缓存中接收更新的数据。按照惯例,这是通过先将数据写入主存,然后在执行读取之前将缓存线更改为共享状态来实现的。
  • 当另一个缓存读取某一行时,该行处于独占状态的缓存必须将该行移动到共享状态。
  • 共享状态可能并不精确。如果一个缓存丢弃一条共享线,另一个缓存可能不知道它现在可以将该线移动到独占状态。

处理器集群包含一个嗅探控制单元(SCU),其中包含存储在各个L1数据缓存中的标签的副本。因此,缓存一致性逻辑:

  • 保持L1数据缓存之间的一致性
  • 仲裁对L2指令和数据接口的访问
  • 具有重复的标记RAM,以跟踪每个堆芯数据中分配的数据

ARM V8A体系结构-第十四章 多核处理器_第5张图片
图14-4中的每个内核都有自己的数据和指令缓存。缓存一致性逻辑包含来自D缓存的标记的本地副本。然而,指令缓存不参与一致性。数据缓存和一致性逻辑之间存在双向通信。
ARM多核处理器还实现了优化,可以在参与的L1缓存之间直接复制干净数据和移动脏数据,而无需访问和等待外部内存。该活动由SCU在多核系统中处理。

3.1 Snoop Control Unit

Snoop控制单元(SCU)保持每个核心的一级数据缓存之间的一致性,并负责管理以下互连操作:

  • 仲裁
  • 交互
  • 缓存到缓存和系统内存传输

处理器还将这些功能公开给其他系统加速器和非缓存DMA驱动的外围设备,以提高性能并降低系统范围内的功耗。这种系统一致性还降低了在每个操作系统驱动程序中保持软件一致性所涉及的软件复杂性。
每个核心可以单独配置为参与或不参与数据缓存一致性管理方案。处理器内的SCU设备自动保持集群内核心之间的1级数据缓存一致性。有关更多信息,请参见第14-10页的缓存一致性和第14-13页的集群内多核缓存一致性。
由于可执行代码的更改频率要低得多,因此此功能不会扩展到L1指令缓存。一致性管理使用基于MOESI的协议实现,该协议经过优化以减少外部内存访问的数量。为了激活内存访问的一致性管理,必须满足以下所有条件:

  • SCU通过其位于专用内存区域的控制寄存器启用。SCU具有可配置的访问控制,限制哪些处理器可以配置它。
  • MMU 启动
  • 正在访问的页面被标记为正常可共享,缓存策略为写回、写分配。然而,设备和强有序内存是不可缓存的,从内核的角度来看,写通缓存的行为类似于未缓存的内存。

SCU只能在单个集群内保持一致性。如果系统中有其他处理器或其他总线主控器,当这些处理器或主控器与MP块共享内存时,需要软件显示同步。

3.2 加速器一致性接口

SCU上的AMBA 4 AXI兼容从机接口为直接与ARMv8处理器接口的主机提供了一个互连点:

  • 该接口支持所有标准读写事务,无需额外的一致性要求。然而,对一致内存区域的任何读取事务都与SCU交互,以测试信息是否已经存储在L1缓存中。
  • SCU在写入被转发到内存系统之前强制执行写入一致性,并可能分配到二级缓存中,从而消除直接写入片外内存对电源和性能的影响。

3.3 集群之间的缓存一致性

第14-13页集群内的多核缓存一致性展示了硬件如何在同一集群内多个处理器缓存之间共享的数据之间保持一致性。系统还可以包含硬件,通过处理可共享的数据事务、广播和维护操作来保持集群之间的一致性。可以动态地从一致性管理中添加或删除集群,例如,当整个集群(包括二级缓存)断电时。操作系统可以通过内置的性能监控单元(PMU)监控相干互连上的活动。

3.4 域

在ARMv8-A体系结构中,术语域用于指代一组主总线主机。域决定哪些主机被监听,以便进行一致的交易。窥探是对主机缓存的检查,以查看请求的位置是否存储在那里。定义了四种域类型:

  • 不共享
  • 内部共享
  • 外部共享
  • 系统级

典型的系统用途是,在同一操作系统下运行的主机位于同一个内部可共享域中。共享可缓存数据但耦合不太紧密的主机位于同一外部可共享域中。同一内域中的主人也必须在同一外域中。内存访问的域选择通过页表中的条目进行控制。
ARM V8A体系结构-第十四章 多核处理器_第6张图片

4、总线协议与Cache一致性关联

将硬件一致性扩展到多集群系统需要一致的总线协议。AMBA 4 ACE规范包括AXI相干扩展(ACE)。完整的ACE接口实现了集群之间的硬件一致性,并使SMP操作系统能够在多个核心上运行。
如果您有多个集群,那么对一个集群中内存的任何共享访问都可以窥探到其他集群的缓存中,以查看数据是否存在,或者是否必须从外部内存加载数据。AMBA 4 ACE Lite接口是完整接口的一个子集,专为单向IO相干系统主控设备(如DMA引擎、网络接口和GPU)设计。这些设备可能没有自己的缓存,但可以从ACE处理器读取共享数据。非核心主机的缓存通常与核心缓存不一致。
例如,在许多系统中,内核无法窥探从端口上GPU的缓存。但事实并非总是相反。ACE Lite允许其他主机在其他集群的缓存中窥探。这意味着,对于可共享位置,如果需要,从一致缓存中执行读取,并将可共享写入与来自一致缓存线的强制清除和失效合并。
ACE规范使TLB和I-Cache维护操作能够广播到所有能够接收它们的设备。数据屏障被发送到从属接口,以确保它们以编程方式完成。
CoreLink CCI-400缓存一致性接口是AMBA 4 ACE的首批实现之一,支持多达两个ACE群集,使多达八个内核能够看到相同的内存视图并运行SMP操作系统,例如,一个大小核组合,如Cortex-A57处理器和Cortex-A53处理器,如图14-6所示。
ARM V8A体系结构-第十四章 多核处理器_第7张图片
它还有三个ACE lite相干接口,可供DMA控制器或GPU使用。

图14-7显示了从Cortex-A53集群读取到Cortex-A57集群的一致数据。

  1. Cortex-A53集群发出一致的读取请求
  2. CCI-400将请求传递给Cortex-A53处理器,以便窥探Cortex-A57集群缓存。
  3. 当收到请求时,Cortex-A57集群会检查其数据缓存的可用性,并用所需信息进行响应。
  4. 如果请求的数据在缓存中,CCI-400会将数据从Cortex-A57集群移动到Cortex-A53集群,从而在Cortex-A53集群中形成缓存线填充。

ARM V8A体系结构-第十四章 多核处理器_第8张图片
CCI-400和ACE协议实现Cortex-A57和Cortex-A53集群之间的完全一致性,使数据共享能够在没有外部内存事务的情况下进行。
ARM CoreLink互连和内存控制器系统IP解决了Cortex-A系列处理器、高性能媒体处理器和动态内存之间高效移动和存储数据的关键挑战,以优化系统性能和片上系统(SoC)的功耗。CoreLink系统IP使SoC设计者能够最大限度地利用系统内存带宽,减少静态和动态延迟。

4.1 计算子系统和移动应用程序

下图显示了带有Cortex-A57和Cortex-A53系列处理器、CoreLink MMU-500系统MMU和一系列CoreLink 400系统IP的移动应用处理器示例:
ARM V8A体系结构-第十四章 多核处理器_第9张图片
在这个系统中,ARM Cortex-A57和Cortex-A53处理器提供了一个巨大的优势大小核集群组合,并通过AMBA 4 ACE连接到CCI-400,以提供完整的硬件一致性。ARM Mali®-T628 GPU和IO相干主机通过AMBA 4 ACE Lite接口连接到CCI-400。
ARM提供了不同的互连选项以保持跨集群一致性:
CoreLink CCI-400高速缓存一致性:它支持两个多核集群,并使用AMBA 4和AMBA一致性扩展或ACE。ACE使用MOESI状态机实现跨集群一致性。
CoreLink CCN-504高速缓存相干网络:它最多支持四个多核集群,包括集成的L3缓存和两个通道72位DDR。ARM CoreLink CCN-504高速缓存相干网络提供了最佳的系统带宽和延迟。CCN系列互连是为使用AMBA 5-CHI连接的核心而设计的,尽管有一些AMBA 4-ACE支持。尤其是CCN-504,提供了符合AMBA 4 AXI Coherency Extensions(ACE)的端口,以实现多个Cortex-A系列处理器之间的完全一致性,更好地利用缓存,简化软件开发。这一功能对于高带宽应用至关重要,包括游戏服务器和网络,这些应用需要一致的单核和多核处理器集群。与ARM CoreLink网络互连和内存控制器IP相结合,CCN提高了系统性能和电源效率。
CoreLink CCN-508高速缓存相干网络:它支持多达8个多核集群、32核,包括集成的L3缓存和四通道72位DDR
CoreLink MMU-500系统MMU:这为系统组件提供地址转换,参见第12章内存管理单元。
CoreLink TZC-400 TrustZone 地址空间控制器:这将对内存或外围设备的事务执行安全检查,并允许将内存区域标记为安全。
CoreLink DMC-400 动态内存控制器:这提供了动态内存调度和与外部DDR2/3或LPDDR2内存的访问接口。
CoreLink NIC-400 网络互联:这是一个高度可配置的系统,使您能够创建一个完整的高性能、优化且符合AMBA标准的网络基础设施。oreLink NIC-400网络互连的支持配置范围从单个网桥组件(例如AHB到AXI协议转换网桥)到由多达128个主设备和64个AMBA协议从设备组成的复杂互连。

你可能感兴趣的:(arm)