性能和复杂度:欢迎使用AMP
来源:    发布时间: 2017-01-05 14:13   421 次浏览   大小:  16px  14px  12px
实现一个AMP系统时最关键的决定是处理器怎样适配到系统存储器层次结构中。这种决定主要考虑的因素是各种处理器上任务访问数据的方式。

作者:Ron Wilson


非对称多处理(Asymmetric multiprocessing, AMP)已经成为2016年度的技术热门词。那么,它究竟是什么,您为什么需要它? 更重要的是,在嵌入式系统中实现AMP时要考虑哪些问题,会遇到什么样的挑战?


让我们从定义开始。一个对称多处理(Symmetric multiprocessing,SMP)系统中,所有处理器在应用级以下基本一致:实际上相同的软件堆栈、指令集、存储器配置和CPU硬件(图1)。在大部分SMP系统中,不同的CPU会执行不同的应用线程,不同的CPU通常会有不同的外设和中断请求连接。而在别的方面,它们都相同。



图1. SMP系统通常有一些相同CPU构成的群,它们共享一个L2高速缓存和总线结构。

数据中心大量使用了SMP,其同一性支持非常灵活的在成千上万个CPU内核中分配任务。在嵌入式领域,SMP并行运行很多线程,提高了有很多线程的任务的执行速度。它还可以用于冗余系统中,结合对比或者表决电路,提高了可靠性。


那么,什么是AMP? 简言之,一个AMP系统是多处理系统,在应用级以下,处理器并不总是相同的。它们在操作系统(OS)、存储器以及处理硬件上会有所不同。


为什么采用非对称?

SMP简单明了。为什么把它搞乱呢? 为什么要把任务限制在某一个处理器中呢? 据Intel WindRiver产品线经理Michel Chabroux,这有几个很好的理由。Chabroux说,“在很多AMP应用案例中,目的是保持任务之间的隔离。” 例如,一名架构师会合并某些有实时期限的任务。而设计人员会选择使用两个CPU内核,一个运行Linux,一个运行实时OS (RTOS)。


当物理隔离内核非常重要时,还会有另一种情况出现。例如,设计人员会把延时关键的任务放到一个单独的内核中,以保护它不受系统级中断的影响。Chabroux指出,自动驾驶汽车中的安全监视任务被放在一个单独的CPU内核中,即使是系统其它部分出现故障时,也能够保证它连续运行。


第三种动机是需要特殊的硬件:在主CPU内核例化中运行的任务达不到其要求的情形。ARM的big.LITTLE技术就是一个例子。通过提供两个二进制兼容CPU内核——一个速度慢,但是功耗很低,而另一个速度快,但是功耗高,big.LITTLE支持管理程序根据需要移动任务,以便优化性能或者能耗。结果是实现了既能满足性能要求而且能耗又极低的系统。


而更常见的是,一个AMP系统中的任务是不可移动的——处理器根本上是不同类型的。这方面的例子包括硬件加速器,例如GPU、FPGA,以及很多专用SoC中的特殊功能加速器等。


基本考虑

不论出于何种动机而选择AMP,任何多处理系统都要面对一些关键问题,这些问题实际上决定了具体实现。这包括怎样执行任务,怎样控制任务,数据怎样在系统中移动,任务怎样访问外部等。


最初的设计目的决定了您为处理器选择什么样的硬件。如果目的只是把某些任务从系统中物理隔离出来,那么,一般最简单的方法是将同样的CPU内核例化多次,但是,某些内核运行的操作系统与其他的内核不同。这意味着相同的OS会有不同的构造——例如,两个Linux内核程序,一个用于处理所有的系统调用。或者,可能是完全不同的环境——例如,一个内核上是Linux,另一个是RTOS或者裸金属应用。


系统约束不仅决定了OS的不同,而且还决定了硬件的不同。例如,以前一直运行在某一类微控制器单元(MCU)内核中的任务最好还是留在这些内核中。对于在ASIC或者FPGA上实现的老的MCU,比较容易为其找到知识产权(IP)。没有人会真的愿意对8051汇编代码老文件进行逆向工程,然后针对64位ARM®内核重新编写C程序。


时间、性能和能耗也是促使转向异构的原因。有时候仅仅把任务与系统中断隔离是不够的:您还需要任务延时非常短而且是确定性延时的CPU。因此,考虑到严格的延时约束,应该把主ARM Cortex-A内核的控制环转到单独的Cortex-R内核中。正如前面所述,性能或者能耗限制决定了某一任务选择某种内核,例如,为要求不高但是连续运行的任务选择低功耗内核,而为大计算量的突发任务选择速度非常快的高功耗内核。


通常,对于大计算量任务,问题在于基本性能。这把我们带入了硬件加速器世界(图2)。这可以是数字信号处理(DSP)内核或者图形处理单元(GPU)等可编程子系统。还可以是功能固定的加速器——例如,加密引擎、协议卸载引擎或者视觉处理器等。也可以是FPGA中的定制并行或者流水线引擎。



图2. AMP系统会含有共享L2高速缓存的不同类型的处理器,处理器连接至高速总线甚至是外部总线。

控制问题

怎样控制在另一处理器中执行的任务一直是多处理的一个关键问题。这存在着明显的问题,例如,任务初始化,启动和停止任务,以及交换消息等。还有一些不太大的问题,例如,获得状态信息,把中断传递给任务,处理例外,以及最重要的——多处理调试要有足够的可观察性和可控制性。


在SMP中,一般通过SMP OS来解决这些问题。每个处理器都有几乎相同的OS例化,因此,它们之间可以相互通信。在AMP系统中,每一个处理器的执行环境都非常不同,因此,情况要复杂得多。在这方面做了很多工作,例如,OpenAMP的例子,多核协会的OpenAMP基于协会的多核通信API (MCAPI),在处理器和各种操作系统之间提供了同构硬件适配层,为任务间通信建立了一组通用资源。相似的,还有运行在各种处理器裸金属的1类系统管理程序,为各种操作系统提供运行良好的虚拟机。但是您还需要进行一些控制工作,详细设计好必须在处理器中实现的裸金属功能。


您可以从至少两种不同的角度来审视这些需求:从应用程序角度,从硬件角度。应用程序会把系统中的每一项任务看成是通过多处理应用程序接口(API)来自动交换信息并同步。或者,如果控制分层非常清晰,那么,主程序会把其他处理器上的任务看成是可调用函数,或者是能够通过器件驱动来访问的I/O操作。


这些方法都与其他处理器上的任务相关,这说明对硬件实现有要求,但不是强制的。如果任务是自主的,那么最简单的实现是非一致性共享存储器系统,具有消息传递机制,还可以扩展大容量私有存储器,而这些存储器与一些处理器相连接。如果任务是同时工作在相同的数据结构上,那么建议采用一致性共享存储器系统。大部分商用CPU内核都能够很好的支持这类系统,但是如果开发不能够自然支持共享存储器管理或者不支持高速缓存一致性的加速器,就会遇到难题。


把附属任务当做函数来处理会比较简单,其硬件实现比共享存储器简单得多。执行函数的处理器可以连接至AMBA®AXI™等宽带硅片互联,或者PCI Express® (PCIe®)等管芯外总线,使得主CPU能够看到本地存储器和控制/状态寄存器。更进一步,如果把任务当做I/O操作,那么处理器可以连接至AMBA APB™等外部总线。


但是应用程序任务和硬件物理连接方式之间并没有必然联系。如果硬件设计人员采用的最简单的方法具有足够延时和带宽,那么就要求软件能够在任何应用级进行仿真。


关键是数据

实现一个AMP系统时最关键的决定是处理器怎样适配到系统存储器层次结构中。这种决定主要考虑的因素是各种处理器上任务访问数据的方式。在一个SMP系统中,默认选择是高速缓存一致性共享存储器结构,任务运行在能够同等访问一个共享存储器空间的任何处理器上。但是在一个AMP系统中,某些任务只运行在某一种处理器上,通常要求存储器体系结构能够调整适应每一项任务的访问方式。


这种调整取决于任务使用存储器的方式:特别是参考位置,访问随时间的变化,以及所需要的带宽等。在传统的共享存储器系统理想情况下,任务读取相对少量的连续数据——这些数据足够少,能够适配到其L1或者L2数据高速缓存中,在短时间内集中处理这些数据,然后转到邻近的另一组不同的数据。这种模式能让几乎所有的负载和存储访问本地高速缓存。


然而,很多重要的算法并不能协同工作。最近的一篇论文估计大数据分析任务错过高速缓存的概率在90%以上。使用规模非常大的表格或者链接表的应用程序也会有非常分散的访问模式。在有些情况下,支持处理器运行任务有自己的私有而且容量非常大的本地存储器。可以把这一存储器作为高速缓存进行管理,而通常更好的方法是在软件中进行管理。有时候高速缓存无法缩短平均访问时间,您不得不找到其他的方法来隐藏存储器访问延时,例如,深度多线程等。这种想法还带来了新概念,例如,大容量闪存阵列可以作为本地存储器直接连接至处理器。


当数据流连续进入一项任务时就会出现一种特殊情形,很短的一系列操作使用这些数据,然后将其传递出去或者清除掉。网络数据包交换、信号处理,以及在控制系统中实现传输函数就会出现这种情况。最好的实现是对处理器的本地存储器直接进行流直接存储器访问(DMA),一起旁路主CPU和存储器,让流任务脱离开主CPU自主运行。


这就带来了最后一点:AMP处理器怎样与外部联系? 处理器一般会有与系统连接的I/O总线,至少能够为初始化和例外恢复提供I/O寄存器控制和状态会话功能。在流处理的情况下,或者处理器处理实时、中断驱动的真实事件时,处理器会与外部有直接I/O连接。而更常见的是,AMP系统中的中断和I/O会话会进入中央CPU,然后通过主存储器缓冲数据。


带来虚拟化

大量的硬件级可选方案展示了AMP强大的能力。您可以为系统中要求最高的每一项任务定制硬件和OS环境。这也带来了AMP最大的风险:如果不注意,系统中每一项重要任务都会面临在不同的环境下执行、通信和调试,而且是不同的存储器模型。


在这里,OpenAMP等标准就可以发挥作用了。还有嵌入式系统管理程序。


Chabroux建议说,“把系统管理程序看作RTOS,调度虚拟机,使其彼此能够进行通信。” 除了设置MMU,系统管理程序还能够让合适的代码与合适的处理器相关联。它可以建立虚拟存储器、器件和网络连接。它能够在FPGA中例化软核处理器。它还可以为任务彼此通信提供统一的方法。


所有这些服务使得AMP系统能够进行软件定义,因此,每一个工作负载都可以看到它所需要的虚拟系统。但是有代价。系统管理程序会占用CPU周期、存储器和功耗。会在关键通路上增加延时,例如中断相应时间等。Chabroux还指出,为避免软件太复杂,系统管理程序需要硬件支持。例如,CPU中的多线程、FPGA中的实时部分重新配置功能、支持DRAM控制器中的多个活动通道的寄存器、总线控制器,以及DMA控制器等都极大的降低了软件复杂度和系统管理程序的延时。


不论有没有系统管理程序,AMP都是满足您系统要求最好的方法。但仍然会有很多的问题,正如板式家具商所说,还得把它们装配起来。