利用非对称CPU性能实现移动智能设备中子系统的快速启动
一、引言
随着智能手机市场的迅猛增长,智能手机出货量在2013年第一季度超过了功能手机出货量。在如此激烈的市场竞争中,许多智能手机厂商致力于在其手机中加入更具吸引力和更高性能的功能,例如高分辨率相机、多媒体编解码器和3D图形,以提升其市场份额。为了支持这些日益多样化功能,智能手机中的应用处理器(AP)变得越来越多功能且复杂。
应用处理器(AP)是移动智能设备中的主要芯片组。它包含一个执行通用计算的主CPU,以及多个提供硬件加速的专用计算的硬件模块(或知识产权(IP))。AP中常见的硬件模块包括2D/3D图形处理器、图像信号处理器(ISP)、多媒体编解码器和外部接口。当移动设备需要支持更多复杂功能,IP模块的功能得到改进,或在系统中集成了附加IP。
由于应用处理器中的IP模块数量不断增加,采用子系统来简化对这些IP模块的可管理性。单个IP模块通常设计用于提供低级功能(例如噪声抑制、图像稳定或图像缩放),而一组IP模块则提供高级功能(例如摄像头或多媒体编解码器)。当IP模块数量增加时,由于软件争用问题,主CPU难以及时管理多个IP模块。为解决此问题,将一个控制单元(或从CPU)与多个IP模块组合构成一个子系统。从CPU专门负责控制该子系统中的IP模块。许多现代应用处理器包含多个子系统,例如图像子系统和多媒体编解码子系统。
子系统是一个小型计算机系统,它运行自己的软件栈来控制子系统内的IP模块。当终端用户请求操作该子系统时(例如启动相机应用),此软件栈将被初始化。当子系统提供更多功能时,问题随之产生,因为其软件栈的复杂性也随之增加。这种复杂性的增加导致子系统的初始化时间变长。长时间的延迟直接降低了使用子系统的应用程序的响应性,从而恶化了用户体验。
快照启动方案是加快系统和子系统启动时间的众所周知的方法。快照引导方案通过利用系统挂起/恢复来实现计算机系统的快速启动。此外,由于子系统也是一种计算机系统,因此该方案也可应用于子系统。然而,以往在利用快照引导方面的研究,要么缺乏对子系统中所有硬件IP的支持,要么需要耗费大量工程投入来获取各种IP的快照。为了恢复IP的状态,必须仔细考虑IP中寄存器文件的特性;获取此类IP的快照需要大量的工程投入。而且,这种耗时耗力的快照获取方法难以直接应用于不同类型或版本的子系统。
本文提出了一种CPU切换启动方法,通过将子系统的启动阶段卸载到同一应用处理器中的主CPU上,以加速子系统启动。主中央处理器通常通过利用更先进的硬件特性(如更大的分支预测缓冲区、多发射乱序执行、更大的内部缓存存储器、更高的时钟频率等)展现出比从CPU更好的性能。此外,两个CPU具有相同的指令集架构,因此子系统的初始化软件二进制文件可以在主CPU上运行而无需重新编译。为了提供相同的执行环境(包括硬件IP和内存),在子系统软件运行于主CPU期间,会仔细配置主CPU的内存管理单元(MMU)和中断控制器单元(ICU)。然而,这些额外操作不依赖于子系统的类型或版本,因此不会影响所提出的方案的可移植性。
基于所提出的方案,该原型被实现到一个图像子系统中,并在智能手机开发板上进行了评估。评估结果表明,所提出的方案将图像子系统的启动时间减少了79%。此外,CPU切换方法为所提出的方案提供了可移植性,因为它所需的设备相关工程工作量极小。
本文的其余部分组织如下。在第二节中,介绍了本工作的背景、相关工作和研究动机。第三节概述了所提出方案的设计与实现。第四节展示了所提出方案的评估结果。第五节讨论了所提出方案在其他系统中的可移植性。结论部分在第六节中给出。
II. 背景和相关工作
A. 子系统
子系统是一组集成IP模块,每个IP模块提供底层单一功能,并共同实现一个高级功能。单独执行每个IP模块通常没有意义;然而,多个IP模块协同工作可实现一个高级功能。例如,硬件编解码器包含直接内存访问(DMA)IP,用于从内存读取/写入数据,以及编码IP和解码IP。编码/解码IP无法在没有DMA IP提供的输入数据的情况下运行。因此,应用程序不会分别管理每个IP模块,而是将所有IP模块作为一个硬件编解码器的整体概念进行交互。
在子系统中,集成从CPU用于管理该子系统内的多个IP模块。每个IP模块的设备驱动程序负责向这些IP模块发起I/O操作请求,并处理来自这些IP模块的中断。在移动智能设备中,当这些设备驱动程序在应用处理器的主CPU上运行时,由于主CPU存在资源竞争,导致对IP模块的请求/响应无法得到及时处理。这是因为主CPU需与其他软件组件和应用程序共享。当这种实时性得不到保障时,例如视频播放负载可能会丢失多个视频帧。因此,许多子系统包含一个低规格处理器(或称从CPU),以将控制域与共享的主CPU隔离开来。包含多个子系统(每个子系统均带有从CPU)的应用处理器通常被称为多处理器片上系统(MPSoC)。
包含从CPU的子系统类似于一个独立计算机系统。该从CPU具有内存(为主系统内存的一部分),并连接有作为设备的IP模块。此外,子系统还包括在从CPU上运行的专用软件(例如固件),用于控制子系统中的IP模块。该软件独立于主系统软件运行。对于复杂子系统而言,其专用软件包括一个简单的实时操作系统(RTOS),可在保持处理任务实时性的同时管理多个任务。因此,当应用处理器包含一个子系统时,该应用处理器上将运行两个操作系统(OS),如图1所示。主操作系统通常是Linux等通用操作系统,而子系统则运行简单RTOS或固件级软件。
当主系统需要子系统提供的功能时,主CPU会调用所需子系统的初始化。如图2所示,子系统的启动从在特定内存地址加载子系统软件二进制文件开始。然后,主CPU唤醒从CPU以启动子系统的初始化,并等待初始化完成。在初始化阶段,从CPU启动其自身的操作系统,然后初始化硬件(即IP模块)和软件。初始化完成后,子系统通知主系统该子系统已准备就绪,可以执行功能。最后,主系统继续执行下一步操作,例如启动应用程序。子系统的初始化阶段类似于典型计算机系统的启动序列,尽管只要主系统需要子系统功能,该启动就会重复发生。
子系统启动时间是指从CPU唤醒到所有初始化任务完成之间的时间段。子系统的启动时间取决于子系统内硬件和软件组件的数量和类型。如果子系统包含大量需要初始化的IP模块,则硬件初始化时间会增加。如果子系统包含复杂的软件库,则其软件初始化时间会增加。由于智能设备厂商正在使应用处理器更加多功能和复杂,这些应用处理器具有更复杂的硬件和软件。这导致子系统启动时间增加,从而降低了需要子系统的应用程序的响应性。
B. 图像子系统
图像子系统是应用处理器中复杂子系统的一个典型示例。图像子系统在移动智能设备中实现相机功能。它主要从外部图像传感器接收称为拜耳数据的原始图像数据,并将这些数据转换为众所周知的图像格式,例如YUV或RGB格式,如图3所示。
更具体地说,当发出拍照命令时,外部图像传感器会捕获原始图像数据。随后,多个IP模块(如噪声抑制、图像稳定和图像缩放IP模块)对原始数据进行后处理,生成拜耳数据。此后,子系统内的软件库执行其他后处理算法。众所周知的后处理算法包括自动对焦、自动曝光和自动白平衡,这些统称为3A算法。最后,处理后的图像数据被传递到主系统中的相机应用。
图像子系统中从CPU的主要作用之一是控制硬件IP模块和软件算法。由于图像采集是实时进行的,从CPU必须以精确的时间间隔调度每个资源。例如,当应用程序拍摄视频时,来自图像传感器的画面需要以每秒30至60帧的速度进行处理。如果从CPU未能及时调度某个资源,则会导致若干帧丢失,从而降低终端用户的视频质量。
从CPU的另一个作用是初始化子系统内的软件和硬件,如上一节所述。从CPU初始化的设备不仅包括内部IP模块,还包括一些外部设备,例如外部图像传感器。3A算法的软件库也在软件初始化阶段被初始化。当主系统请求摄像头设备工作时,所有这些初始化阶段都会重复发生。因此,从终端用户延迟的角度来看,子系统的启动(或初始化)时间非常重要。
从CPU性能是影响子系统启动时间的重要因素,因为它负责处理子系统内所有组件的初始化。硬件初始化的延迟取决于子系统中所使用的具体硬件。然而,子系统软件初始化的延迟则完全依赖于从CPU的性能。从CPU的硬件规格通常被设定为能够及时处理IP模块和软件算法,而无需考虑初始化时间。因此,从CPU的性能通常低于主CPU。例如,主CPU支持具有多级流水线的超标量乱序执行,并包含较大的分支预测缓冲区;而从CPU仅支持具有少量流水线级数的顺序执行,且分支缓冲区较小。当从CPU的性能足以执行所需功能(即3A算法和I/O请求/响应处理)时,厂商没有理由安装更强大的CPU,否则会增加系统的单件成本和功耗。
C. 相关工作
考虑到子系统的启动序列与传统计算机系统类似,因此与改善子系统启动时间最相关研究是快速启动方法。例如,伯德提出了一系列用于减少通用操作系统启动时间的方法。他分析了启动序列,并提出了几种方法,例如消除探测延迟、实时时钟(RTC)同步、就地执行(XiP),以及通过禁用调试消息输出来避免访问慢速串行设备。然而,这些优化无法应用于子系统操作系统,因为它们是针对Linux内核特有的。子系统通常具有非常轻量级的内核,这些功能要么已经应用,要么由于缺少相应功能而无法应用。
神永提出的快照启动方法利用通用操作系统的挂起/恢复技术来减少系统启动时间。该方法仅生成一次快照二进制文件,之后每次系统启动均使用该快照二进制文件。软件初始化阶段包括全局结构初始化、对象创建、应用程序初始化和进程生成,这些是复杂系统启动过程中最耗时的任务。快照启动通过跳过这些软件初始化阶段,显著缩短了启动时间。
快照启动方法已应用于许多消费电子产品。例如,Jo et al将快照启动方法应用于数字电视平台。在该研究中,当硬件IP的寄存器在读取时其值会发生变化,系统恢复期间恢复硬件IP的状态变得困难。因此,在读取寄存器以生成快照后,寄存器状态与快照中存储的值不同。这种值不一致阻碍了快照启动的应用。针对此类系统的方法是通过再次调用设备初始化阶段来重新初始化指定的IP模块。
Baik et al将快照方法应用于基于通用操作系统的智能手机。在该研究中,为了减小快照二进制文件的占用空间,在生成快照时会将未使用的内存页换出或回收。然而,智能手机中的某些设备不支持休眠。他们对此问题的解决方案是利用每个设备的挂起模式。当设备被挂起时,其恢复数据存储在内存中。因此,快照二进制文件可以包含每个设备的恢复数据。在快照启动期间初始化这些设备时,首先将设备初始化至挂起状态,然后将挂起的数据恢复到各个设备中。
将快照启动方法应用于子系统的主要困难在于恢复硬件IP状态的复杂性。子系统操作系统中的设备驱动程序通常不支持挂起或休眠,因此读取和恢复IP状态是复杂的任务,需要仔细考虑IP状态寄存器的各种特性。
Kim et al将快照启动方法应用于移动智能设备中的图像处理子系统。该方法的快照启动序列本身与其他方法非常相似,如图4所示。然而,该方法提出了适当的快照技术,以应对具有不同状态恢复特性的IP模块。目标寄存器类型包括只读寄存器、写清除寄存器、具有初始化依赖的寄存器以及与IP模块内部缓冲区相关联的寄存器。该方法的缺点是需要大量的工程投入。一个IP模块通常包含数千个状态寄存器,在多个IP模块中对数千个寄存器应用不同的读取/恢复方法会导致较高的工程成本。
D. 研究动机
关于包含子系统的快速系统启动的先前研究主要集中在应用快照启动方法。然而,这些方法存在若干缺点。当某些IP模块的设备驱动程序未提供挂起/恢复操作时,设备必须在快照启动阶段再次进行初始化。这会再次增加启动时间,在设备初始化耗时较长的情况下,可能抵消快照启动带来的优势。即使可以通过访问IP模块的内存映射I/O区域来读取和恢复IP模块的状态,也需要考虑每个状态寄存器的特性。这增加了快照启动方法的复杂性,并且难以轻松应用于其他类型或版本的子系统。
因此,找到一种不依赖快照启动方法的快速启动方法非常重要。尽管从CPU的性能足以确保子系统正常运行功能,但如果存在比从CPU更快的中央处理器,则可以缩短子系统的启动时间。
实际上,移动系统在应用处理器(AP)中已经拥有更强大的中央处理器,即主CPU。由于主CPU负责处理主机系统中许多功能的运行,因此配备了更先进的硬件特性,如第二节-B中所述。因此,如果主CPU能够承担子系统的初始化阶段,子系统的启动时间将大大缩短。
III. 中央处理器切换启动
A. 概述
CPU切换启动方法的核心思想是将子系统的启动序列从从CPU转移到主CPU上执行。从概念上看,这种方法非常直接,如图5所示。当子系统的某个功能被启动时,包括子系统操作系统内核在内的初始化软件在主CPU上运行,而不是在从CPU上运行。它负责初始化子系统中要使用的硬件IP和软件库。当初始化完成后,子系统的控制权从主CPU转移到从CPU。最后,从CPU恢复其主要功能。
无论初始化是在从CPU还是主CPU上执行,都不会影响子系统的功能。当硬件IP被初始化时,其初始化状态会作为IP内部寄存器的值和状态被保存下来。子系统软件的状态也会在内存中保留。因此,当从CPU接管子系统的控制权时,子系统的状态可以与从CPU执行初始化时的状态保持一致,从而使得从CPU能够继续执行子系统的功能。
该方法的主要优势在于,它可以避免与硬件相关的工程工作(如相关工作[5]-[7]中所述),同时实现子系统的快速启动。由于该方案使用为在从CPU上运行而编译的原生二进制软件,而不是对子系统进行快照,因此不需要任何快照生成阶段。因此,无需考虑硬件IP中的硬件寄存器的各种特性[5],[7]。在这方面,所提出的方案可应用于任何类型的子系统或其修订版本,包括遗留子系统。
为了在主CPU上透明地运行子系统软件,需要解决两个问题。首先,针对子系统定制的二进制可执行文件需要能够在主CPU上运行。
主CPU。这意味着两个中央处理器必须具有相同的指令集架构。在许多多核片上系统中,从CPU和主CPU基于相同的中央处理器架构构建。在某些情况下,主CPU支持的指令集比从CPU更多。然而,子系统软件二进制文件仍然与主CPU兼容,因为较新版本的中央处理器通常提供向后兼容性。因此,用于从CPU的二进制可执行文件可以在主CPU上运行而无需任何修改。
其次,当子系统软件在主CPU上运行时,其执行环境应与从CPU上的执行环境相同。执行环境包括硬件设备(或IP模块)和内存系统。这意味着主CPU应对子系统的内部设备具有一致视图。此外,从主CPU和从CPU的角度来看,内存页的内容应保持一致。以下两个小节分别描述了为提供硬件设备和内存的一致视图所做的努力。
B. 提供一致的硬件视图
子系统软件的作用之一是初始化子系统的硬件设备(或IP模块)。为了在主CPU中透明地初始化IP模块,主CPU应能够像从CPU一样访问这些IP模块并处理来自它们的中断。此外,为了最大限度减少对子系统软件的修改,主CPU应具有用于访问IP模块及处理其中断的一致接口。
在现代多核片上系统中,各个IP的特殊功能寄存器(SFR)通过内存映射I/O机制进行访问。这些SFR区域通常对两个CPU都可见,以便于调试。然而,两个CPU对于相同的SFR区域具有不同的物理地址区域。这种物理地址差异可以通过使用每个CPU的内存管理单元轻松解决。子系统软件基本上在其MMU启用的情况下以保护模式运行,因此对SFR区域的访问是在虚拟地址空间中进行的。为此,主CPU的MMU被配置为提供与从CPU一致的SFR区域虚拟地址空间。
硬件IP的中断能否传递到主CPU至关重要,因为这涉及硬件依赖于具体实现。某些子系统专用的IP模块具有连接到两个CPU的中断线。然而,如定时器和通用异步收发传输器(UART)等通用IP模块的中断线通常未连接到主CPU,如图6所示。一般来说,这些IP模块属于基础IP模块,每个CPU都有自己的一套此类IP模块。因此,无论子系统软件在哪个CPU上运行,都应使用本地IP核。
然而,这种使用本地IP核的限制并不会引起任何子系统软件的修改。与修改软件不同,两个中央处理器中的SFR区域映射稍作调整即可。在两个中央处理器中,访问复制IP模块的虚拟地址区域被配置为访问本地IP核。因此,从子系统软件的角度来看,同一虚拟地址区域会根据子系统软件运行的位置而连接到不同的IP模块。
C. 提供一致的内存视图
在子系统启动期间,软件库会初始化分配给子系统的内存页中的数据结构和变量。即使主CPU对数据进行了初始化,当从CPU继续执行时,这些数据也应保持有效。初始化的内容可能包括用于组织数据结构(如链表或二叉树)的内存指针。因此,主CPU和从CPU应具有相同的虚拟地址空间以及与之关联的物理页。
从概念上讲,通过在两个CPU中正确编程MMU,可以提供相同的虚拟地址空间,如图7所示。在开始初始化之前,主CPU已知子系统将使用哪些物理页。因此,在启动子系统之前仔细配置两个MMU,可使两个CPU拥有映射到相同物理页的相同虚拟页。当控制转移到从CPU时,设置从CPU页表的页全局目录。
实际上,为两个中央处理器提供一致的虚拟内存空间存在三个方面的问题:缓存一致性、输入/输出内存管理单元(IOMMU)以及与主CPU内核的虚拟地址范围冲突。
首先,两个中央处理器都有私有缓存,且这些缓存通常不具有缓存一致性。在主CPU与子系统之间运行缓存一致性协议开销较大。此外,从主CPU的角度来看,子系统被视为一个I/O设备。因此,在处理I/O请求和响应时,仅通过软件来管理一致性。一个问题在于,当某个内存区域的当前内容被缓存在主CPU的缓存中时,从CPU无法读取该内存区域的当前副本。
解决上述问题的方法是在控制权转移至从CPU时,将与子系统相关的内存页从主CPU缓存中刷新。这类似于I/O请求/响应(例如,读取/写入存储)的一致性管理。通过刷新相应的主CPU的缓存行中,当前数据存储在物理内存中。当从CPU继续执行时,可以从物理内存读取数据的当前副本。
其次,现代智能设备集成了IOMMU。IOMMU提供I/O地址空间与物理地址空间之间的地址转换;此外,它通常在应用处理器中的子系统之间共享。因此,在主CPU中建立页表时应考虑这种两阶段地址转换。
此外,子系统软件基本上假定在MMU禁用时会执行少量指令。由于从CPU上的子系统软件执行始于唤醒从CPU,因此其MMU在页表基地址被加载到MMU之前一直处于禁用状态。为此,在从CPU的MMU启用之前,子系统二进制文件被编程为使用从CPU中的地址重映射SFR。例如,如图7所示,子系统二进制文件的起始地址为0x0000,而子系统的I/O地址空间从0x4000开始。地址重映射SFR用于补偿此地址冲突。然而,当子系统软件在主CPU上运行时,主CPU并不存在MMU被禁用的阶段,因此在主CPU中使用地址重映射SFR是不必要的。
最后一个问题是主CPU中的操作系统内核与从CPU中的内核之间的虚拟地址冲突。操作系统内核通常会使用高虚拟地址空间,并且该地址空间在上下文切换期间会被保留。因此,当子系统软件在主CPU上运行时,高地址空间已经被主操作系统内核占用。
为了解决此地址空间冲突,在子系统初始化阶段,主CPU会从主操作系统内核中隔离(例如,CPU热拔出)。由于现代应用处理器为主CPU配备了多核处理器,隔离其中一个CPU(或核心)并不会停止主系统的所有功能。此外,子系统的初始化时间仅为几十微秒;因此,被隔离的CPU在主系统中不可用的时间非常短暂。因此,认为这种CPU隔离引起的性能下降可以忽略不计。
然而,主操作系统中的CPU隔离需要额外的工作以确保主系统正确运行。应禁用所有发送到被隔离CPU的中断。当此类中断被传递到被隔离的CPU时,该CPU没有适当的中断服务例程。因此,应正确配置主CPU的中断控制单元,使得除了子系统中IP模块发起的中断外,其他所有中断均被屏蔽,以免传递至被隔离的CPU。在子系统的控制权从被隔离的主CPU转移到从CPU之后,被隔离的CPU将返回至主操作系统内核(例如,通过CPU热插拔)。
IV. 评估
A. 评估环境
所提出的方案在智能设备开发板上进行了实现和评估。该开发板配备了一个双核主CPU,并具有一个内部图像子系统。主CPU和图像子系统中的从CPU均基于通用嵌入式处理器架构。表I显示了两个中央处理器的详细规格。
| 规格 | 主CPU | 从CPU |
|---|---|---|
| 时钟频率 | 1.6 GHz | 400 MHz |
| L1缓存指令 | 32 KB | 16 KB |
| Data | 32 KB | 16 KB |
| L2缓存 | 1 MB | N/A |
| 缓存行大小 | 64字节 | 32字节 |
| 超标量 | 三路发射 | 单发射 |
| 流水线 | 15–25级 | 8级 |
| 执行类型 | 乱序执行 | 顺序执行 |
| 分支历史缓冲区 | 1024–16384个条目 | 256个条目 |
| D(Dhrystone)MIPS/MHz | 3.6 | 1.6 |
子系统软件基于实时嵌入式操作系统构建。为了便于评估,主CPU运行相同的操作系统。因此,所提出的方案是在相同操作系统上实现。将所提出的方案与应用于图像子系统的正常启动方法和快照启动方法进行了对比评估。
B. 评估结果
CPU切换方法的主要目标是加速子系统的启动时间。为了测量所提出的方案将启动时间缩短了多少,对目标板上图像子系统的启动时间进行了测量;结果如图8所示。如图所示,正常启动耗时314.3毫秒。在正常启动过程中,图像子系统中软件库的初始化耗时最长,为256.9毫秒。由于软件初始化阶段的执行时间取决于中央处理器的性能,因此所提出的方案对于加速启动时间是有效的。硬件初始化阶段(IP初始化和外部传感器初始化)占据了启动时间中第二长的部分。
快照启动方法耗时52.1毫秒(正常启动的17%)。由于该方案无需执行软件,因此消除了软件初始化阶段。此外,通过恢复硬件IP的状态,除外部传感器初始化外,IP初始化阶段也被消除。需要注意的是,外部传感器的状态无法通过快照启动方法恢复,因为它不支持挂起或内存映射寄存器访问。启动子系统时,无需初始化硬件或软件,只需将快照镜像复制到适当的内存区域。然而,加载二进制阶段的时间略有增加,因为快照二进制文件比子系统的正常二进制可执行文件大8 MB。
CPU切换方法的启动时间为69.4毫秒(正常启动的22%),略长于快照启动方案。具体而言,加载二进制阶段与正常启动相同,因为两种方案使用了相同的二进制文件。硬件初始化阶段的执行时间与正常启动时间相近,因为这些时间在很大程度上与CPU性能无关。主要软件初始化阶段是缩短初始化时间的主要贡献因素,因为使用了快速主CPU。
图像子系统的初始化时间缩短可以提升相机应用的响应性。因此,当用户想要拍摄照片时,相机应用能够更快地准备就绪,从而降低错失理想场景的可能性。在没有采用快速启动方法的情况下,300毫秒的响应时间对人眼而言已足够明显。这一延迟在人机交互中被量化为明显的响应时间。然而,所提出的方案仅显示出70毫秒的响应时间。该延迟被归类为快速响应。
尽管所提出的方案比快照启动方法慢了17.3毫秒,但这额外延迟无法被感知。此外,由于多种原因,快照方法在应用于其他系统类型时会带来较高的工程成本。这些原因在第四节-C中进行了详细说明。
为了确定使用快速主CPU的优势,进行了附加测量。首先,为了确定主CPU高时钟频率的影响,测量了主CPU在400 MHz下的软件初始化时间。该时钟频率与从CPU的时钟频率相同。如图9所示,软件初始化时间减少了四倍。由于主CPU运行在最大时钟频率的四分之一,执行时间大约减少了四倍。然而,该时间仍比从CPU快两倍以上。这种性能差距被认为与表I中所示两个CPU在DMIPS/MHz方面的性能一致。
主CPU和从CPU的非对称性能不仅由不同的时钟频率引起,还源于仅在主CPU上应用的先进硬件特性。主CPU采用具有15到25级流水线的三路超标量乱序执行单元,而从CPU则采用仅有8级流水线的单路顺序执行单元。此外,主CPU配备了一级缓存更大比从CPU的更高;此外,主CPU仅有1 MB的二级缓存。最后,主CPU具有更复杂的预取单元,包括更大的分支历史、目标和返回栈缓冲区。
为了确定这些架构改进是否提升了运行时性能,使用每个中央处理器中的性能监控单元测量了其他与性能相关的因素。图10展示了L1缓存失效率和与分支预测相关的指标。由于从CPU没有二级缓存,因此未测量其缓存失效率。
如图所示,从CPU表现出更高的缓存失效率,尤其是在指令缓存方面。主CPU的缓存更大,并且支持比从CPU更宽的缓存行。这被认为是导致从CPU失效率较高的原因。
关于分支预测,从CPU表现出较低的可预测分支率和较高的分支错误预测率。从CPU支持的可预测分支指令集是主CPU中对应指令集的一个子集。例如,向程序计数器寄存器进行加载的指令在主CPU中是分支预测的目标,但在从CPU中则不是。此外,该嵌入式处理器架构同时支持32位和16位指令。两种模式之间的切换指令在主CPU中是分支预测目标,但在从CPU中则不是。由于这些原因,从CPU的可预测分支指令率较低。
最后,从CPU表现出更高的分支错误预测率。由于从CPU的分支历史缓冲区比主CPU小,其分支预测准确率较低。
C. 工程投入
了解所提出的CPU切换方法相较于快照启动方法在加速子系统启动方面是否高效非常重要。要将快照引导方案应用于子系统,关键在于对硬件IP进行快照并恢复快照镜像。硬件IP的快照由子系统中每个IP模块的SFR区域组成。以图像子系统为例,与SFR区域相关的快照镜像为83 KB,包含了约5000个SFR的状态。对于大多数寄存器而言,通过简单地读取和写入SFR区域即可轻松完成快照和恢复。然而,对于某些类型的寄存器,这些过程非常困难。例如,读取写清除寄存器的状态就很困难。如果某些寄存器存在编程依赖性,则快照镜像必须按照依赖顺序进行拆分和恢复。更为关键的是,一些寄存器在开发人员手册中是隐藏的,因为文档仅描述了用于编程IP的实际使用的寄存器。然而,在应用快照启动方法时,这些遗漏的寄存器也必须被拍摄快照并恢复。在测试的图像子系统中,有10%的总SFR属于这些类别。在这种情况下,当对子系统进行修改时,拍摄寄存器快照并恢复的每一步都必须重新执行,这将带来较高的工程成本。
即使引入了子系统的新版本,软件开发者也应开发两个软件二进制文件。一个是原始的子系统软件二进制文件;另一个是为新软件制作的新快照二进制文件。
所提出的CPU切换方法无需考虑数千个硬件寄存器的复杂特性。此外,开发人员只需开发原始的子系统软件。因此,该CPU切换方法被认为可以轻松应用于其他类型或版本的子系统,而无需较高的工程成本。
五. 讨论
所提出的方案是否能够扩展到其他类型的系统,是可移植性方面的一个重要问题。尽管所提出的方案是在实时操作系统内核上实现的,但它可以部署到其他通用操作系统内核上,例如Linux。
为了将CPU切换方法应用于通用操作系统内核,应修改与子系统相关的设备驱动程序。基本上,此类设备驱动程序负责为子系统分配内存页、配置IOMMU、加载子系统软件二进制文件以及唤醒从CPU。在这方面,在唤醒从CPU之前,应在设备驱动程序的操作中增加以下三个步骤。
首先,设备驱动程序需要创建一个与子系统相同的虚拟地址空间。由于物理页已经分配,并且I/O地址空间与物理页之间的映射关系已知,因此创建相同的虚拟地址空间是直接的。本地外设的SFR区域在此步骤中,也映射到虚拟地址空间。页表(例如,页全局目录)的基地址随后用于对主CPU的MMU进行编程。
其次,主CPU的一个核心应从主操作系统内核的调度和中断处理中隔离出来,因为在子系统启动期间,该核心专用于子系统。尽管这需要主操作系统内核的协助,但许多通用操作系统内核已经支持某种形式的CPU隔离(例如,CPU热插拔)。由于设备驱动程序在特权级别下运行,因此CPU隔离是可行的。在子系统的控制权转移到从CPU后,被隔离的核心将重新交还给主操作系统内核。在隔离的核心上,一个线程会进行轮询,直到所需资源(即子系统软件二进制文件和页表的基地址)就绪为止。
最后,设备驱动程序加载子系统二进制文件,并通知线程页表的基地址。轮询线程配置隔离核心的MMU,然后跳转到子系统二进制文件的主例程。通过将二进制文件加载、创建页表和准备线程的过程重叠执行,可以最小化线程的轮询时间。当子系统初始化完成后,子系统软件会触发一个中断,通知主系统初始化已完成。随后,从CPU被唤醒并接管控制权。隔离的核心被归还给主操作系统内核。
这些额外的步骤实际上与系统中子系统的类型无关。与子系统相关的部分已在三个步骤开始之前处理完毕。因此,一旦开发出一种通用方法,只需将这三个步骤移植到其他设备驱动程序中,即可将其应用于系统中的其他子系统。
VI. 结论
在移动智能设备中,由硬件设备(如摄像头或硬件编解码器)支持的应用程序的快速执行至关重要。这些硬件设备并非单一设备,而是被视为子系统的复杂系统。因此,子系统的快速启动直接关系到这些应用程序的响应性。
本文提出了一种CPU切换方法,该方法利用移动智能设备中中央处理器的非对称性能。通过将子系统的缓慢启动阶段卸载到应用处理器中的快速主CPU上执行,显著减少了子系统启动阶段的执行时间。此外,由于避免了对内部设备中复杂硬件寄存器的访问,与将快照启动方法应用于子系统相比,所提出的方案仅需少量的工程工作。
1997

被折叠的 条评论
为什么被折叠?



