第1章 从多处理器系统到多核系统
早前的研究主要集中在单处理器系统上,但随着商业应用和工业发展的要求,越来越多的领域需要使用到多片微处理器。多处理器系统可以将工作量分配到不同的处理器上,从而实现冗余、加速、模块化甚至是简化代码。
使用多处理器的理由主要是由项目的要求决定的。如图1-1所示,假设系统需要实现显示、键盘、响应事件、控制执行器和与主机Host通信功能;以对Events的响应要求为例,执行器Actuators需要根据Events来实时做出动作,但Events的数据量很小。如果采用单片CPU,CPU的处理速度必须足够快以致对Events的开销不会影响高速Events的性能(如中断),也不会因为Events的快速重复速率降低密集消息处理函数的数量。这样可能会过分追求高性能的CPU而增加系统的成本。这种情况看起来并不是那么直观:对于彼此独立的任务群而言,每一个处理器的处理负载要比由一个处理器处理的负载小得多。
图1-1 多处理器系统示意图
在图1-1中,每一个CPU都可以有自己独立的PROM、RAM和I/O,其中CPU1的功能是实现人机交互,CPU3用于控制执行器和处理外部事件,CPU2用于连通CPU1和CPU3以及上层主机。系统中需要采用多少个处理器依赖于:
● 软件的相互依赖关系;
● 处理器的吞吐量;
● 处理器的位置。
1.1 板内处理器间的通信
实现多处理器嵌入式系统的一个难点是处理器之间的通信,根据处理器物理位置的不同,可以分为板内通信和板间通信;根据通信方式的不同,又可以分为寄存器通信和串行通信等。最为简单和廉价的通信方式是利用数字锁存器。如图1-2所示是双向通信寄存器的原理图。
图1-2 双向通信寄存器原理图
假设数据流是从CPU1到CPU2。寄存器每次传送8位数据,总线切换时钟(Bus Exchange Clock)实现双向数据流向的控制。当时钟信号从低变成高的时候,74LS374的输出Qn跟踪其输入Dn,即此时数据处于更新状态;而当时钟信号为低电平时,不管Dn如何变化,Qn始终维持不变,即此时数据处于锁定状态。74LS374的这一性能有助于让CPU2有充足的时间来获取CPU1发送来的数据,但缺点是CPU1却不知道CPU2是否获取数据,也不知道自己需要等待多长时间来更新数据。同样的问题也存在于当CPU2向CPU1发送数据时。第二个缺点是,CPU1的处理速度严重受限于CPU2,因为它一直要等待CPU2成功接收数据,特别是CPU2被某种中断引起循环时。要解决这一问题,需要给两片74LS374分别加一个更新和读完的状态信号,状态信号可以利用74LS374的状态缓冲、CPU端口的某一位或者是扩展芯片的某个引脚。为了提高系统的处理速度,建议将读完的状态信号直接连接到两CPU的外部中断引脚上,这样当一方确认读完发送来的信息,就可以及时通知到发送信息方。
如果所对应的CPU是内置DMA控制器的,那么传输的速度还可以进一步得到提高,这是因为DMA不需要CPU本身的干预。简单的说,此时将更新完的状态信号连接到CPU2的DMA请求信号线上,而将读完的状态信号连接到CPU1的DMA请求信号线上。最快的DMA方式是单周期和单地址的flyby模式(另外一种模式是fetch-and-deposit),在这种模式下,一个总线周期可以同时完成从源地址取数并写入目的地址的过程。DMA传送数据的过程如下:
(1)CPU利用指令向DMA控制器发出DMA传送请求;
(2)DMA控制器向CPU发出总线请求,要求CPU交出总线管理和使用权,并在接到CPU的总线响应后接管系统总线的管理和使用权,从而变成系统的主设备;
(3)DMA控制器将被访问的存储器单元地址送到地址总线上;
(4)向存储器和进行DMA传送的外部设备(CPU2)发出读写命令,则存储器和外部设备通过数据总线进行数据交换;
(5)若需要继续传送,则将DMA请求信号继续保持高电平;
(6)如果数据传送完成,DMA撤销对CPU总线的请求,交回系统总线的管理和使用权。
DMA传送的时序图如图1-3所示。
图1-3 DMA传送的时序图
必须指出的是,仅当其中一个CPU具有DMA控制器时也可以实现DMA传送,图1-4给出了一个DMA传输的实用电路。
图1-4 DMA接口示意图
在图1-4中,CPU1将需要发送的数据发送到内存中,编程利用DMA控制器传送,而CPU2编程实现其DMA控制器从寄存器中读取数据并存储到内存中。问题是:CPU2无法确定传送数据的大小,通常有以下三种方法解决这一问题:
(1)第一种方法是使用固定的数据量,比如每次只传送256个字节,如果数据量少于256个字节,可在数据后补0来达到固定长度。
(2)第二种方法是采用报头,即CPU1通过DMA传送的第一位数据是其要传送的数据长度信息,CPU2的DMA接收到该位信息后即再次引发DMA中断开始接收数据。
(3)第三种方法需要在两个CPU之间开辟一条额外的中断路径。首先CPU2建立其DMA控制器来接收比实际信息更多的字节;之后CPU1建立其DMA传送机制并传送数据,一旦传送完成,即通过独立的中断路径通知CPU2,CPU2随即开始接收并处理数据。在这种模式下,CPU2是不会产生中断的,因为它不需要处理信息量。
尽管利用DMA实现CPU之间的互连可以大大提高其通信速率,但如果CPU之间的运行速度相差太大,也会存在问题。如果CPU1的速度小于CPU2的速度,CPU2可能会检测到数据更新完的状态并开始读取数据,而此时 CPU1仍然处在写使能状态;反过来,如果CPU1的速度大于CPU2的速度,可能会导致CPU1在写新数据位的时候,CPU2仍然处在读使能状态。这两种情况的出现,均会导致信息的误读或重读。要避免这一情况的发生,最好的方法是在CPU间加上FIFO。
FIFO(First In First Out)的全称是先进先出存储器。先进先出也是FIFO的主要特点。20世纪80年代早期,FIFO芯片是基于移位寄存器的中规模逻辑器件。容量为n的这种FIFO中,输入的数据逐个寄存器移位,经n 次移位才能输出。因此,这种FIFO的输入到输出的延时与容量成正比,工作效率得到限制。为了提高FIFO 的容量和减小输出延时,现在FIFO的内部存储器均采用双端口RAM,数据从输入到读出的延迟大大缩小。以通用的IDT7202为例,结构框图如图1-5所示。输入和输出具有两套数据线。独立的读/写地址指针在读/写脉冲的控制下顺序地从双端口RAM 读/写数据,读/写指针均从第一个存储单元开始,到最后一个存储单元,然后又回到第一个存储单元。标志逻辑部分即内部仲裁电路通过对读指针和写指针的比较,相应给出双端口 RAM 的空(EF)和满(FF)状态指示,甚至还有中间指示(XO/HF)。如果内部仲裁仅提供空和满状态指示,FIFO 的传输效率得不到充分的发挥。新型的FIFO 提供可编程标志功能,例如,可以设置空加4或满减4的标志输出。目前,为了使容量得到更大提高,存储单元采用动态RAM 代替静态RAM,并将刷新电路集成在芯片内,且内部仲裁单元决定器件的输入、读出及自动刷新操作。FIFO 只允许两端一个写、一个读,因此FIFO 是一种半共享式存储器。在双CPU系统中,只允许一个CPU 往FIFO写数据,另一个CPU 从FIFO 读数据。而且,只要注意标志输出,空指示不写,满指示不读,就不会发生写入数据丢失和读出数据无效的现象。
图1-5 基于双端口RAM的FIFO
数字信号处理器(DSP)能实时快速地实现各种数字信号处理算法,而DSP的控制功能不强,可以采用8051单片机控制数据采集板,将采集的原始数据送给DSP处理并将处理结果传送给8位单片机。图1-6给出了利用1片数字信号处理器TMS320F206(以下简称DSP)和2片AT89C51单片机(以下简称MCU)构成多机数据采集系统的接口图。
图1-6 数字信号处理器和单片机通信系统
系统采用两片CMOS 静态双端口RAM(IDT7132)实现MCU和DSP的数据双向传递。双端口RAM作为DSP的片外数据存储器,即用外部数据存储器选通信号DS和高位地址信号经高速或门输出选通双端口RAM的片选信号。这样可以利用DSP的重复操作指令(RPT)和数据存储器块移动指令(BLDD)减少数据传送时间,双端口RAM的8位数据总线接在DSP的低8位。IDT7132的仲裁逻辑控制只提供Busy逻辑输出,而由于MCU无Busy功能,只能采用自行设计的软件协议仲裁方法。将双端口RAM划分为两块:上行数据区(DSP接收MCU采集的数据区)和下行数据区(DSP输出处理结果区)。此处的上行数据区将远大于下行数据区。采用DSP的4个I/O口与MCU中断口和I/O口相连,并在数据区中规定一个信令交换单元。以DSP采集右端MCU上行数据为例来说明仲裁流程:
(1)初始化时,DSP置IO3为输出口,保持高电平,IO2为输入口(MCU使其初始化为低电平);
(2)DSP需要采集MCU数据时,向右端IDT7132下行数据区的下行信令字单元(此处设为00H)写入需要取数的信令字,再向右端MCU发中断,置IO3为低电平,然后查询IO2等待MCU应答;
(3)MCU及时响应中断后,则先从IDT7132的下行数据区的下行信令字单元读取DSP请求信息,检测为DSP需要取数的下行信令。然后,向IDT7132上行数据区的上行信令字单元写入数据,准备好需要DSP取数据的信令(00H)或数据未准备好的信令(01H)。最后,向DSP发送应答信号,置IO2为高电平(此处高电平的持续时间只要DSP可以检测到即可);
(4)DSP检测到IO2为高电平,表明MCU应答,立即读取IDT7132上行数据区的上行信令字单元。若为可以取数据的上行信令,则从 IDT7132上行数据区取出采集数据。完成后,需要向右端 MCU发送采集结束下行信令(01H);若为数据未准备好的上行信令(01H),则跳转至与左端MCU 通信程序中。
1.2 板间通信
板与板之间的通信主要采用串行通信方式。根据其协议的不同,可以分为RS-485/232C、I2C、CAN或并口等形式。图1-7是采用RS-485总线实现三片CPU之间数据互连的示意图, CPU之间共享两条串行总线。
图1-7 基于RS-485的多CPU互连示意图
第二种常用的板间通信采用CAN(Controller Area Network)协议,CAN起源于汽车的应用需求。与图1-7不同的是,CAN支持多主机模式,每一个主机节点的地位都是等同的(即对等式的现场总线),而且并不指定具体的地址。主机的地址信息包含在被传送信息中,而且在系统工作时可以添加或移动节点。
CAN总线采用120欧姆的差分公用线,其传输速率随传输距离的不同而不同,10km的时候其传输速率为5kbits/s,在40m的时候传输速率为1Mbits/s。CAN总线最多可以有110个节点,传输介质可以是双绞线、同轴电缆和光纤。CAN总线遵循ISO/OSI网络标准模式,但只使用了其中的物理层和数据链路层。CAN在1991年9月制定并发布了其第二版,该版本包括A和B两个部分,其中A版本给出了其早期1.2版本中的报文格式,而B版本给出了其标准和扩展的两种报文格式。这导致CAN有两种帧格式,其中一种是含有11位标识符的标准格式和29位标识符的扩展格式。其标准格式如图1-8所示。
图1-8 CAN的11位标识符的帧格式
CAN使用非归零码(Non-return to Zero),其信号线上存在的两种状态电平如图1-9所示。
图1-9 CAN差分电平示意图
从图1-9可知,CAN上的信号存在两种状态,当其处在状态1时,差分信号线上的电平均为2.5V,而处于状态0时,差分线上的其中一根的电平上拉至3.5V,另一根被下拉到1.2V。现在很多的微处理器芯片如Silabs的C8051F040都内置CAN接口模块。
计算机并口的工作模式有5种:标准并行接口(SPP)、简单双向接口(PS2,即EPP 1.7)、增强并行接口(EPP1.9)、扩展功能接口(ECP)和多模式接口(比如 ECP+EPP)。其物理接口采用IEEE1284标准描述的DB 25针内孔式连接器。并口的定义中给出了数据寄存器、状态寄存器和控制寄存器的引脚及引脚在相应寄存器字节中的位置,其中,l8~25号引脚全部接地。我们给出SPP模式和ECP模式下所有引脚的信号定义如表1-1所示。在IBM-PC上,并口的基地址是数据地址0X278或0X378,其后是状态寄存器(0X279或0X379)和控制寄存器(0X27A或0X37A)。
表1-1 EPP和ECP接口定义
EPP使用与标准并行口相同的25针D型插件。当其处于增强模式时,实际上只用了8条数据线和5个信号线。这5个信号的定义与以前的相比有所改变。
写(Strobe)信号在第1引脚上,通知与EPP相连的设备。数据通过数据线时,这个信号定义为WRITE#,低电平有效。它与标准并行口的Strobe信号所用脚相同。14引脚的数据选通(AutoFd)信号,表明8条数据上的信号为有效数据,可读。在通常的操作中,PC或其他设备通过EPP传送数据,首先激活数据线,当确认了正确的信号值之后,再激活数据选通信号。这种两步实现的方式可防止信号传输过程中被错误传递。这个信号定义为低电平有效。地址选通(SelectIn)信号在第17引脚,它的功能类似于数据选通信号,用来保证数据线的可靠。地址选通线信号表明数据线上的值为地址值,可以用来选择与总线相连的寄存器或设备。
这个信号定义为低电平有效。等待(Busy)信号在第11引脚,用来证实数据传输是否成功,该信号定义为低电平有效。跳到高电平后,就认可接收数据。中断(nAck)信号在第10引脚,与EPP相连的设备用其向主机请求中断。该信号平时为低电平,跳到高电平时,就提出中断申请。图1-10所示是利用并口进行双CPU通信的示意图。
图1-10 DSP和CPU并口通信原理图
1.3 Intel的嵌入式处理器
值得一提的是,世界上第一代处理器是一台嵌入式设备。Intel公司于1971年开发了Intel 4004处理器,该处理器是世界上第一款商用计算机微处理器,其片内集成了2250个晶体管,晶体管之间的距离是10微米,能够处理4bit数据并能对4096字节的内存寻址。该处理器每秒运算6万次,时钟频率为108kHz,成本不到100美元。英特尔公司的首席执行官戈登·摩尔将4004称之为“人类历史上最具革新性的产品之一”。
1.3.1 Intel 186处理器
Intel 186处理器是Intel公司于1982年推出的时钟速度为6MHz的又一款处理器,该处理器与最早用在IBM PC中的Intel 8086类似。它内部集成了一个直接内存存取(DMA)控制器和一个中断控制器。集成化是嵌入式处理器的一个重要功能,这里所指的嵌入式处理器由先前处理器中的独立集成电路提供。目前的嵌入式应用中所用的加强型Intel 186处理器的时钟频率为25MHz,其可寻址的内存空间能够达到1MB。
1.3.2 Intel 386TM处理器
Intel 公司于1985年推出了时钟速度为16MHz的Intel 386TM处理器,它内部集成了275000个晶体管。该处理器为x86系列处理器增加了一系列的功能,如32位运算、受保护内存和任务交换(Task switching)等。该处理器的时钟频率范围为16MHz到40MHz,可寻址内存空间为16MB到4GB,具体的寻址空间大小由实际的应用决定。其应用领域非常广泛,如在卫星控制系统和机器人控制系统等领域。
32位处理器可以一次处理32位数据。Intel386TM之前的x86处理器是16位或8位的, 16位处理器在处理由本机格式(native format)表示的数值时存在较大的限制。16位的数值范围为0~65535,同理,32位的数值能表示0至接近40亿之间的任何整数。如果数值超过了0~65535的范围,16位的处理器此时就显得无能为力,这时就需要32位处理器来处理了,它能够处理0~40亿范围内的数值。但是32位处理器的可寻址内存也面临着相同的问题,即实际应用中如果所要处理的数值超过了40亿呢,那么32位处理器岂不是也不够用了?对于该问题,需要说明的是,32位处理器能够满足大多数的实际应用,也就是说,实际应用中所要处理的数值范围一般不会超过40亿。
另外,32位处理器可以扩展到64位,或者能模拟64位处理器的操作,不过与真正的64位处理器相比,其运行速度自然要低一些。图1-11所示的是在32位处理器上进行64位加法操作,它将该加法分解为若干32位加法。如果通过软件仿真该加法时,能观察低32位和高32位的高位之间的进位。
图1-11 64位加法模拟图
基本的IA-32结构的寄存器组包括通用寄存器(GPRs),entitled EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI。图1-12描述了基本的IA-32 ISA(instruction set architecture,指令集架构)中的寄存器,32位的寄存器EAX、EBX、ECX和EDX以16位或8位的格式存取。例如,要访问汇编代码中EAX的低16位时只需访问AX即可;若需要访问EAX的低8位,访问AL即可;访问EAX的第二个8位或AX的高8位,只需访问AH。Intel386通常与x87浮点式协同处理器配对使用,该协同处理器的寄存器组如图1-12中所示,ST(0)-ST(7)尺寸为80位,其数值以堆栈形式进行存取。Intel 386TM处理器引入了受保护的内存机制,该内存机制允许操作系统提供以下功能:
图1-12 x86和x87寄存器组
● 内存保护;
● 虚拟内存;
● 任务切换。
在Intel386TM处理器推出之前,x86操作系统在内存空间和内存保护等方面确实受到限制。程序在没有内存保护的处理器上运行时,可以对程序分配的内存之外的区域进行写操作,这样做可能会破坏其他的程序和数据。实际上,程序在运行时是受系统控制的,一旦程序崩溃,它会使得整个系统崩溃。而内存保护能很好地解决这个问题,其原理是通过限制某个特定程序能访问的内存空间,且该内存空间是操作系统为该程序分配的。一旦应用程序试图访问为其分配的内存区域之外的区域,处理器就会捕捉到该访问,并允许操作系统在改变内存的情况下对该访问进行干涉,接着将其中断并使程序停止。
即使是在物理内存使用受限时,虚拟内存也可以为应用程序提供一个从0到4GB的相连地址空间。处理器可以将程序所使用的虚拟地址之间的地址映射到系统中隐含的物理地址中去。典型的,当物理内存小于虚拟地址空间时,可利用一个硬盘驱动来模拟较大的地址范围。
基于操作系统的调度试探(OS scheduling heuristics),任务切换和多任务使得操作系统能够同时执行多进程和任务切换。任务切换的关键技术是中断操作系统正在运行的程序和功能,以节约当前执行进程的运行时间(runtime context)。
1.3.3 Intel 486TM处理器
Intel公司于1989年推出了Intel 486TM,其时钟频率为20MHz,内部集成了1200,000个晶体管。它与 Intel386TM很相似,区别在于它在处理器上集成了一个浮点数单元和缓存区(cache);另外,该处理器使用流水线操作来提升性能。Intel 486已经经历了很长的使用期,在目前的嵌入式应用中仍然前景广泛,如航空电子飞行系统,销售系统(POS)设备和全球定位系统(GPS)等。目前基于Intel 486的嵌入式应用中,时钟频率范围从33MHz到100MHz。
1.浮点单元
Intel486集成了一个浮点单元,该浮点单元相当于作为Intel386处理器补充功能的387协同处理器。浮点单元执行浮点数操作,这些浮点数用来表示实际数(带小数的正、负数);举一个浮点数的例子:3.14156。x87的浮点数模型可用寄存器的堆栈表示,这8个寄存器都是80位的(见图1-12)。浮点数数值从内存中载入,它们在内存中可能是32位(单精度)或者64位(双精度)的;调用过程为:位于堆栈顶部的运算数被弹出,然后对其进行相应的运算,运算结束后又被压入堆栈。集成化的浮点数在很多嵌入式应用中得到了高性能的应用,如仪器仪表、航空工业和导航系统中。
2.高速缓冲存储器
高速缓冲存储器位于处理器和主存之间,是为存储的数据和代码提供快速访问的局部存储器。由于处理器的速度相对于主存的速度来说要高,因此为了减小或消除它们之间的速度差异对性能带来的影响,高速缓存是必要的。如果没有高速缓存,处理器可能需要花费几个周期的闲置时间等待数据从内存中读出或写入内存。早期版本的 Intel 486TM集成了一个8KB的缓存用于提供数据和指令。目前市场上的x86处理器都包含若干MB不同等级的高速缓存。表1-2提供了几种典型的对不同存储体系的访问时间和访问量。从表中可以看出,存储器离处理器越远,对它的访问时间越多。因此能有效使用缓存是提高应用程序性能的最好方法之一,并且缓存的使用是许多性能分析研究中的重点内容。
表1-2 对几种典型的不同存储等级的访问
3.管线化
管线化操作又叫流水线操作,是用来提高处理器性能的一项技术,这项技术的构思来源于实际的生产流水线。在生产流水线中,一个完整的任务被分解为各个不同部分,每个部分由各自相应的操作完成。采用管线操作的好处是可以在同一时间内同时处理任务的不同阶段,处理器中的流水线操作也是这个原理。
Intel486TM处理器流水线操作的方法是将一个x86整型指令分解为以下不同部分:
● 提取(Fetch);
● 解码1(Decode-1);
● 解码2(Decode-2);
● 执行(Execute);
● 写回(Write back)。
第一步“提取”包含一个对内存的提取指令;“解码1”阶段决定操作的执行和执行过程中所需的资源;“解码2”决定操作数的地址;“执行”阶段是操作数的具体执行过程;“写回”所做的是将运算在指定时间内得到运行。图1-13所示是几个不同指令执行这5个步骤的过程。列指的是周期时间,列为1-8;行为“指令1”到“指令4”,代表样本指令;表中的各项代表的是流水线操作中的各个阶段,“F”、“D1”、“D2”、“E”和“wb”分别表示“提取”、“解码1”、“解码2”、“执行”和“写回”。流水线操作的优点体现在5列和8列之间,一旦流水线载入了指令,则每个周期内完成一个指令。考虑一下,如果不采用流水线操作,且执行同样的解码、执行和写回指令;此时,一个指令需要花费5个时间周期的闲置时间。从概念上说,流水线操作的好处十分明显,不过,对这个简单的例子,还有一些因素值得注意,它们会影响流水线操作实现性能最大化。这些因素如指令间的独立性、内存时延和执行资源的缺乏等。处理调度指令时,汇编语言程序员和编译程序编写员需要谨慎处理流水线操作。此外,嵌入式软件开发人员需要对流水线操作有一定的掌握,不过最优调度的主要方面是强制优化编译器。
图1-13 指令的流水线操作
1.3.4 Intel奔腾处理器
1993年,Intel公司开发了Intel奔腾处理器,它以0.8微米技术集成了大约300万个晶体管,该微结构是一种称为超标量执行体系的新型设计,它能有效提升处理器性能。随后出现的MMXTM Intel 奔腾处理器至今仍在很多嵌入式应用领域得到广泛的应用,如POS系统、电话系统和网络应用等。目前这个系列的处理器的时钟频率范围为166MHz到266MHz。热设计功耗(TDP)为4.1~17.0W。MMXTM指令是IA-32 ISA的延伸,目的是提高整型操作的性能。奔腾处理器也是第一代具有性能监视计数器(PMCs)的嵌入式 Intel 微结构处理器。
1.超标量指令执行(Superscalar Execution)
超标量指令执行是处理器的一种性能特征,它通过复制执行资源来达到允许多指令同时执行的目的。在处理器使用流水线操作时,超标量指令执行可以允许多个管线在管线的同一阶段中同时至少执行两个不同的指令。
图1-14显示的是在管线超标量执行处理器上执行的指令样本集。超标量指令执行要求复制处理器内部的执行资源。通过比较执行性能可以很明显地看出超标量指令执行的优点。超标量指令执行在一个周期中同时执行两条指令,而不是一个周期只执行一条指令。
Pentium处理器拥有两个资源路径(管线,pipelines),可以达到在一个时钟周期内完成一条以上的指令。一个管线(称为"U")可以处理任何的指令,而另外一个(称为"V")可以处理简单、最共同的指令。这些约束条件要求汇编程序员和编译员需要高度注意指令对,以期这些指令对能够一起执行。指令的明确调度与处理器的乱序执行(Out Of Order)关系不大,关于这点将在后面章节中介绍。
图1-14 超标量指令执行管线操作
2.性能监视计数器(Performance Monitoring Counters)
PMC 可以收集关于内部处理器事件的信息并允许软件工具记录并显示所收集到的信息。这些信息包括多个事件,如时钟周期、指令休眠(instructions retired)和缓存丢失等。奔腾处理器是第一代能够实现基本事件计数的嵌入式Intel 架构处理器。该技术在不断成熟,并且能够以连续的方式记录越来越多的处理器事件,例如,可以根据一个给定的事件如缓存丢失,找到与该事件相关的指令。嵌入式软件开发人员为了进行性能调试,可以利用PMC测量工具来帮助他们调整应用程序。
1.3.5 Intel Pentium III处理器
Intel公司在Pentium II和Pentium Pro处理器的基础上,于1999年推出了Intel Pentium III处理器。该处理器集成了950万个晶体管,并采用了0.18微米技术,时钟频率达到500MHz。该款处理器集成了更大容量的高速缓存(如512KB),包含OOO(Out Of Order)执行,引入了SSE(Streaming SIMD Extensions)以及与高性能浮点计算相配合的扩展指令集。目前基于Pentium III的嵌入式设备的工作频率范围为600MHz~1.26GHz。其主要的嵌入式应用领域有工业应用如数据获取、公用电话系统、博彩和安全系统等。
1.OOO执行
OOO是指能够不按照程序提供的顺序完成计算任务,是一种加快处理器运算速度的架构。该处理器包含允许指令与其他正在执行中的指令不完全独立的逻辑。图1-15显示了两个加法的汇编语言和指令间的独立性。特别地,虽然第4行和第5行的指令位于程序列的第4和第5的位置,但是超标量构架体系仍可认为这些执行指令能够同时执行,因为可以认为第1行和第2行的执行指令能够得到足够的执行资源。注意到第3行的指令独立于第1、2行的指令;类似的,第6行的指令独立于第4、5行的指令。超标量处理器能够反映出这些独立性,因此在数据都准备好之前,它不会执行第3行和第6行的指令。
图1-15 样本汇编语言程序
2.SSE
SSE(Streaming SIMD Extensions)是对x86和x87指令集的延伸,它能够实现单精度浮点数的SIMD(Single Instructions Multiple Data)执行。 可以认为SIMD处理是向量处理,它允许仅利用一个指令(单指令)就可以在多个不同数据块上执行相同的计算。SSE 包括70条指令,其中包含单指令多数据浮点计算、以及额外的SIMD整数和高速缓存控制指令。其优势包括:更高分辨率的图像浏览和处理、高质量音频、MPEG2视频、MPEG2加/解密;语音识别占用更少CPU资源;更高精度和更快响应速度。SIMD执行能够在很大程度上提升多种应用程序的性能,因为它们试图对大量的数据使用相同的操作。SSE2、SSE3、SSSE3和SSE4都是SSE的后续版本。SSE增加了对8个128位寄存器XMM0-XMM7的支持,每个寄存器可以存储4个单精度浮点数。使用这些寄存器的程序必须使用FXSAVE和FXRSTR指令来保持和恢复状态。但是在Pentium III对SSE的实现中,浮点数寄存器又一次被新的指令集占用了,但是这一次切换运算模式不是必要的了,只是 SSE 和浮点数指令不能同时进入CPU的处理线而已。表1-3总结了SSE自开发以来的各种发展版本。
表1-3 指令集延伸描述
1.3.6 Intel Pentium IV 处理器
Intel公司2000年推出的奔腾IV CPU采用了Intel的Netburst技术,与Intel奔腾III CPU处理器相比,体系结构的流水线深度增加了一倍,达到了20级。从而极大地提高了奔腾IV CPU的性能和频率,改进了的浮点运算功能使奔腾IV提供更加逼真的视频和三维图形,带来更加精彩的游戏和多媒体享受,极大地丰富和完善了视频处理等方面的应用。奔腾IV利用0.18μm的微架构使其时钟频率可以达到1.5GHz,并且内部集成了42000000个晶体管。该处理器使用超线程技术来提高性能,超线程技术是指同时执行多线程(SMT)的意思。目前,奔腾IV的嵌入式应用方面,时钟频率范围由35W TDP时的1.7GHz到84W TDP时的3.4GHz。嵌入式应用主要包括先进的交互式客户端、数字安全监控(DSS)和工业自动化解决方案等。由于性能的改进和功率利用率的提升,嵌入式应用也需要不断使用最新的处理器。
超线程技术的概念用来描述 Intel 版本的 SMT,SMT 允许单处理器发挥出多处理器的性能。因为一个执行切换中的并行数是有限的,因此即使是超标量流水线操作中的乱序执行也不能利用所有的处理器资源,超线程的开发就源于此。SMT 试图利用其他线程和进程的资源。图1-16显示的是超线程技术在资源利用方面与超标量执行体系以及多进程处理的不同。在超标量执行体系中,同一时间内只能允许与流水线中的执行进程相关的指令存在;而多进程处理中,可以同时执行两个处理器的指令,但是这两组指令相互之间是独立的。超线程技术的优点就在于能够使与两个进程各自相关的指令可以同时分享处理器的资源。需要指出的是,嵌入式软件开发人员在实际开发中需要注意线程间的数据分享。
图1-16 超线程执行模型(每一个方框代表一个执行单元)
1.3.7 Pentium M处理器
奔腾M处理器是英特尔公司在2002年推出的,它是英特尔对构建移动环境专用处理器的首次尝试,并且集合了奔腾3及奔腾4的优点,与英特尔当时推荐笔记本使用的奔腾4处理器相比,性能更高,耗能更少。该处理器的时钟频率范围为900MHz~1.7GHz。目前基于它的嵌入式应用中,处理器频率范围为12W TDP时的1.1GHz到27W TDP时的2.0GHz。这些嵌入式应用领域主要有:先进的交互式客户端、工业自动化和企业通信等。
与奔腾IV处理器的TDP相比,奔腾M处理器在TDP方面显示出了可观的改进。实际上,奔腾M处理器主要为移动通信行业量身设计,目的是降低总体的功率消耗,如C-States、微指令融合和扩展的堆栈指针叠加。加强型Intel SpeedStep 技术使用了C-States,当应用程序不需要使用所有的处理器性能时,通过降低电压和频率来减少功耗。“微指令融合”技术是指将流水线中的两个指令融合到一起以减少系统开销。“扩展堆栈指针重叠”通过分别处理堆栈调整来降低执行单元的负荷。功率利用在小型移动系统中是一个非常关键的问题,而这个因素也成为限制高性能发挥的主要因素。与此同时,处理器技术正在不断地开发合理的处理器频率,以期实现不断减小功耗限,通常称此功耗限为功耗墙(Power Wall),发展的目的就是不断降低功耗墙的大小。
1.3.8 双核Intel Xeon 处理器
Dual-Core Intel Xeon处理器LV和ULV以及Dual-Core Intel Xeon 处理器5100系列是Intel公司2006年推出的新一代处理器,它基于称为Intel Core微架构的台式/服务器处理器。这些处理器的时钟频率从1.66GHz到2.33GHz,拥有2MB的共享缓存,它是针对双核处理器的双核设计。目前基于这些处理器的嵌入式应用领域有:存储区域网络(SAN)、网络连接存储(NAS)和虚拟专用网(VPN)等。
1.3.9 应用于嵌入式计算的英特尔酷睿2双核处理器
应用于嵌入式计算的Intel coreTM 2 Duo处理器开发于2006年,它是对Dual-Core Intel Xeon处理器LV和ULV的精炼版本。其时钟频率范围从1.5GHz~2.16GHz,拥有2MB或4MB共享缓存,它也属于双核体系设计。TDP范围从1.5GHz时钟频率时的17W到2.13GHz时的64W。目前,基于该处理器的嵌入式应用主要针对较小的平台,而不是先前处理器应用的交互式端口、游戏平台、DSS和医疗处理等较大的平台。该处理器同时还支持Intel 64 ISA,即支持64位的指令集并能提供比32位处理器更多的地址空间。
当Intel扩展IA-32 ISA的指令集用以支持64位计算时,需要对其做很多修改,首先需要将其通用寄存器的内部尺寸增加到64位;通用寄存器的数量也需要从32位的x86模型的8个寄存器增加到16个寄存器,并指定R8到R15用于高层次的8个寄存器。另外,SEE寄存器的数量也要由8个增加到16个,地址空间也要扩展到能够支持16位寻址。为了尽量减少这些修改工作,已经开发了多种不同的执行模式。第一种模式称为传统模式,第二种称为IA-32e模式。传统模式中,只支持32位处理,不支持64位处理。而IA-32e模式同时支持32位操作和64位操作。还有其他几个值得注意的特征如下:
(1)相对指令(RIP)寻址——对数据的访问与指令指针相关联,指令指针可以减少对共享库的开发。
(2)可以对所有64位通用寄存器的32位、16位和8位单元进行访问/存取。
1.3.10 Quad-Core Intel Xeon Processor 5300系列
Quad-Core Intel Xeon Processor 5300系列处理器于2007年上市,它将4个处理器核封装在一起,也属于酷睿2处理器类。其时钟频率范围从2.0GHz到2.33GHz,拥有8MB二级缓存,前端总线速度为1333MHz时的TDP为80W。目前,该处理器主要应用于高性能的嵌入式应用中,如入侵检测/预防、IP服务(Service over IP)和视频点播等。
1.4 嵌入式发展趋势和近期处理器的影响
未来的处理器发展趋势主要在功能区块的集成、处理器核数量不断增加、功耗性能不断提升等方面。典型的IA-32架构和Intel 64架构处理器要求2个额外的分离芯片用来提供I/O、主存和图形存储器接口。由于晶体管的利用率提高,系统级芯片(SOC)IA-32架构处理器将会集成这些功能并能有效改善功率利用率。新型的低功耗IA-32架构处理器会在优化功耗方面取得进展,它的原理是移除如OOO超标量体系执行的高性能处理器功能,并重新利用一个更简化的流水线架构。处理器的另一个发展方向被称为异构设计,它联合使用带有一系列封装处理器的IA-32架构处理器。
还有一个值得关注的发展趋势是继续采用IA-32架构的微处理器,重点研究它在台式机和服务器中的应用,而采用45nm处理技术的多核处理器可用于台式和服务器系统中。目前,虽然利用45nm处理技术制造的处理器还没有进入嵌入式市场,不过确实值得期待。
Intel Xeon 5400处理器已经应用于服务器市场,并且该处理器或者其修改版本会逐渐在嵌入式市场中得到应用。该处理器集成了8 200 000 000个晶体管,采用45nm处理技术的四核设计,二级缓存能够达到12MB。随着该处理器的推出,很多新的功能都被逐渐开发出来,如新的Intel SSE4指令;能够在处理器闲置时降低功耗的新技术;在其他处理器核闲置时,采用新技术可以加速当前正在工作的处理器核的速度等。
1.5 从多CPU系统到多核系统
1.5.1 多核处理器的产生原因
尽管还没有确切的研究结果表明IPL技术带来的效益正在缩减,不过,通过多核技术的发展趋势能够推断出这一点。厂商已经生产出第一代SMT处理器,且多核处理器表明,可以利用晶体管来增加处理器核数,以获得相对于增强型ILP 技术更好的性能。图1-17所示的内容形象地说明了为什么多核处理器备受人们的关注。图中在三种不同配置情况下分别运行若干应用程序,并得到关于功耗和性能之间关系的比较,图中的配置从左到右分别为:
● 将标准单核处理器时钟频率提高20%;
● 标准单核处理器最大时钟频率;
● 将双核处理器的每个核时钟频率降低20%。
图1-17 多核性能和功耗
比较配置1和配置2可以看出,当功耗增加到1.73x的同时应用程序的性能只增加到了1.13x;然后将标准配置2与配置3比较,配置3的性能增加到1.73x时,其功耗只增加到1.02x。结果很明显,应用程序正常运行时,多核处理器能获得较高性能提升,且与频率呈直线增加的情况相比其功耗仅增加了一点点。这里有两点值得注意:第一,并不是对所有的应用程序而言多核处理器的性能都能获得很大的提高;第二,为了获得良好的性能增益,程序开发人员需要掌握更多关于多核技术的知识。
讨论一个问题:为什么时钟频率的增加和功耗的增加不成比例呢?看看互补金属氧化物半导体(CMOS)微处理器的功耗方程就会明白了,全功耗的简化方程式为:
P CV F= × 2×
式中,C是动态电容,V 是供电电压,F是时钟频率。
动态电容的大小取决于处理器中晶体管的数量,晶体管越多电容值越大。在上面等式中可以看出电压和功耗呈平方关系,而供电电压的作用是驱动晶体管,所以供电电压的大小在方程中是非常关键的量。还要注意的一点是,频率和电压的关系为:频率增加时电压也要发生一定的变化,目的是确保快速准确地获知晶体管的状态变化。同样地,频率降低时,晶体管的驱动电压也要相应变低,这就是为什么当功耗差不多相同时双核比单核的频率低了20%。
多核处理器是指在一枚处理器中集成两个或多个完整的计算引擎(内核)。多处理器系统又叫多CPU系统,是指一个系统中包含有多个处理器,且这些处理器各自负责某个模块的任务。众所周知,多处理器核在多处理器系统中的应用时间已经很长,不过二者在很多方面确有不同之处,列举如下:
(1)通信延迟;
(2)带宽;
(3)处理器数量。
首先,多核处理器的通信延迟通常比多处理器要低。多核处理器的内核间的带宽通常要高于多处理器带宽,原因在于处理器各个内核之间是很接近的。以英特尔公司的Dual-Core Xeon处理器5100系列为例,它是一个多核的多处理器。两个处理器通过一根高速前端总线相连,并且每个处理器包含各自独立的处理器内核,这些内核之间可以共享二级缓存。二级缓存的延迟为10~20个周期,主存储器的延迟为100个周期。二级缓存的数据宽度为256位,所提供的带宽为64GB。前端总线运行频率为667MHz,提供的带宽是每秒5GB。同一个处理器上的两个核之间的延迟和带宽相对于不同处理器中的不同核间的延迟和带宽要好10倍。
考虑多核系统中可用的处理器核数与目前多处理器系统中可用的处理器核数时,二者确实有所不同。目前多核AI-32体系结构处理器最多存在4个内核,人们曾经把64个AI-32体系结构处理器应用在同一个系统当中。通过不断的地发展和应用之后,期望应用在多核处理器中的内核数量将越来越多。不过,实际中批量生产这种多核处理器之前必须要解决与之相关的硬件和软件配套问题。
当前应用较成功的是英特尔公司的酷睿双核处理器,它将两个结构相似的处理器内核结合在一起组成双核处理器。图1-18给出了两种多核处理器的体系结构,一种是核间独立使用二级缓存的多核处理器,另一种是处理器核共享二级缓存的多核处理器。开发人员预想用一种简单的方法把两个或多个处理器内核封装在一起使之成为一个集成芯片,而不是与多处理器一样,将多个处理器内核通过系统的总线连接构成一个系统。图1-18给出的两种多核处理器体系结构在内核之间的局部连接上有所不同。图1-18(a)显示的为两个独立的处理器内核,每个都有各自的二级缓存,但可以共享系统总线和系统存储器;图1-18(b)是两个独立的处理器内核共享一个二级缓存、系统总线和系统存储器。这两种接法各有优劣,目前应用较多的多核处理器体系结构以第二种为主,该结构的优点如下:
图1-18 独立使用二级缓存的多核处理器和核间共享二级缓存的多核处理器
(1)可以根据当前应用程序对二级缓存的需求,动态调节为每个核分配内存空间;
(2)在两个内核之间共享一些项,处理器核上的线程可以通过快速的二级缓存实现同步,而不是通过主存或下一级缓存实现同步。
1.5.2 同构多核和异构多核
根据处理器核的封装类型的不同,可以将多核处理器分为同构多核和异构多核。同构多核处理器是指封装在一起的处理器核支持相同的指令集架构(ISA)。Intel 酷睿双核处理器就是同构多核处理器,其两个处理器核的类型是相同的。
异构多核是指封装在一起的处理器核支持不同的ISA。异构多核处理器可以根据实际的任务和工作需要,安排特定的处理器核。例如,Intel CE 2110 Media 处理器由一个Intel Xscale处理器核和一个Intel Micro Signal Architecture(MSA)DSP核组成。Tolapai SOC Accelerator是一个由低功耗的IA-32架构处理器与多个处理引擎合成一体的片上系统。异构多核处理器的优点在于可以通过应用程序的具体要求来选择性能最优的处理器核。对于 Tolapai SOC Accelerator而言,集成化的IA-32架构处理器在解决综合用途处理的同时,还提供了丰富的原版软件以减少对应用程序的开发。封装的处理引擎增强了网络处理功能,如加密功能、IP安全和虚拟专用网络算法等。
对多核处理器的一种新的分类方法称为 many-core,many-core 多核处理器由一组较大的处理器核组成,且这些处理器核并非完全相同,也并非一定是包含一种典型多核处理器的核。如图1-19所示就是一种异构many-core处理器,它由一些强大的超标量IA-32架构处理器核组成,这些处理器核适用于处理通用目标计算,也适用于能够处理特定进程并按序执行的低功耗IA-32架构微处理器核组。
图1-19 假定的多核处理器
1.5.3 对称多核和非对称多核
多核处理器的另一种分类方法是:整个嵌入式系统中各个处理器核之间是以什么关系相联系的。按照这种分类方法可以将其分为两类:对称的和非对称的。它们的不同点如下:
● 存储器存取;
● 操作系统;
● 处理器核之间的通信;
● 负载平衡和处理器的连接关系。
对称多进程(SMP)系统中,系统中的处理器核具有类似的系统结构,且它们共享主存,这意味着,处理器的每个内核都可以访问和修改主存中的数据。在非对称的多进程(AMP)中,各个核在系统中的结构不同,因此主存区域是分离的,即意味着两个处理器核不能对相同的内存位置进行直接存取和修改。
通常,SMP需要利用一个操作系统(OS)来控制处理器核,而配置为AMP系统的嵌入式系统则包含多个操作系统以实现系统的有效分割。
SMP 系统中处理器内核之间的通信是通过共享内存并依靠操作系统提供能实现同步和锁存的功能。在具有分离内存区域的AMP系统中,则是通过消息传递设备来传送数据,然后从一个操作系统上传送到另外一个系统上。多核通信应用程序接口(MACAPI)是 AMP系统中用于实现核间信息通信的标准。AMP系统中另外一项技术是为共享数据提供内存映像,它利用特定的硬件来实现两个内核在不同处理器内核之间共享不同的地址空间。
SMP系统中的负载平衡由操作系统完成并以操作系统的调度为准。例如,对Linux 的SMP 执行情况是将处理器核作为任务资源的集合,并根据内核上的当前运行负载为处理器核分配线程。SMP操作系统支持处理器关联(Processor affinity),它允许将不同进程分配到特定的处理器核中去。注意,AMP系统是静态分割的,因此在嵌入式应用中,分配给某个操作系统的处理器核不能被其他操作系统所共享。
1.5.4 多核嵌入式处理器的优点
多核处理器为程序开发人员提供了更多的可用计算机资源,用来解决特定的工作或任务。这些资源带来的好处主要有两点:改进周转时间和增加吞吐量。销售点(POP)系统中的事务处理就是一个改进周转时间的例子,在这个应用中,利用多处理器核的优点会提高事务处理的时间。具体方法是将其中一个处理器核用于更新终端显示,另一个处理器核用来处理输入数据。当处理来自POS终端大量的后台事务时还可以提高服务器的吞吐量。从这个例子并结合多核处理器的优点可以推知:可以利用多核处理器的优点在期望的时间内完成相对于单核处理器时更多任务的处理。能同时提高周转时间并增加吞吐量的措施是平衡功率利用率。对于用在客户端或者后端服务器采集的单个系统而言,需要指定其功率的大小。由于少量系统要求达到一些特殊的性能指标,而这些额外的性能提升可能会引起空间、功耗和降温措施等的开销,因此在实际应用中需要注意。
可扩展性(Scalability)表示的是应用程序从其他的处理器核得到的资源或利益的程度大小,处理器核数的增多会带来相应的性能提升。图1-20显示的是多核处理器可能获得的性能提升比例。
图
1-20 多核性能提升示意图
图中的“Supralinear”区域指的是性能提升比例相对于增加处理器核数时比例大的区域。性能加速比例达到“Supralinear”区域的情况很少,不过当应用程序从增加的缓存容量和布局等方面得到性能提升时,会出现性能提升的速度大于处理器核增加比例。图中的直线“Linear”表示理论情况下,性能的提升速度与处理器核的增加数目呈线性关系。“Typical scaling”曲线表示的是通常情况下,当运行的处理器核数增加时,样本程序得到的性能增加曲线。该曲线显示了当所用的处理器核数量增加时,性能会有所提升,但是却不会按照比例线性增加,当处理器核到达一定数量时,反而出现性能曲线减缓。那么为什么性能曲线不呈线性呢?原因是实际中存在并行性不够或者是并行性引起的开销问题。实际应用中有的通信开销是不可避免的,因此很多情况下根本不可能实现线性加速。所以值得一提的是,使用并行化的目的是尽可能在应用程序中提高性能,但是并不一定会取得多大的性能提高。
1.6 本章小结
多CPU系统的出现已经有数十年的历史,其中已经产生了许多具有深远影响的结构和程序设计理论,而多核系统是近几年才出现的新结构。理论上说,多CPU中的理论和方法对多核系统的设计具有借鉴意义,有些甚至可以直接使用。本章的目的是使读者对这两种形式的结构有初步的了解和认识。