嵌入式系统设计是一支软件和硬件相辅相成的和谐之舞。问题在于:软件和硬件谁唱主角?谁来领导?谁来控制两者的关系?
一方面,是硬件在做实际工作,但另一方面,系统的最终功能却体现在软件中,而硬件只起辅助作用。至于哪一种讲法更为确切,硬件和软件工程师可能有不同看法。
实际上,系统硬件和软件在高层次上是一起定义的。板上内容、存储器空间、I/O以及其它类似的硬件都是为实现软件所执行的功能而配备的。但在一个低层次上,一旦选定了一款处理引擎,则片上的计算资源就被固定且无法改变了。
对这一固定架构的任何改变,必须通过补添另外的加速器芯片实现。一旦落实了处理器的选择决定,则工作重心将从以满足软件需要的硬件设计转移到确保符合单个处理器或多个处理器(在多核实现下)约束的软件实现阶段。
在嵌入式设计中,这点表现得更为明显,这里资源相对缺乏、其性能可能是任务关键型的,硬件握有话语权,软件是从属。在这样一个相互依赖的关系中,软件成为一个好帮手,它必须满足硬件的(有时哪怕是不合理的)要求。
为将这种状况造成的不良后果减至最小,避免陷入这种变动局面,超额指配硬件资源并非难事;不过这可能导致系统的硬件资源比实际需求的还要多,从而增加成本。
图1:采用负载平衡技术,FPGA支持不规则流水线。 |
相反,若不预留额外资源,将会出现软件所需资源可能超过实际可用硬件资源的风险,这样就必须以后换用一个更大处理器;软件将会对疲于奔命感到厌倦,并要求选用新硬件。
许多类似网络处理器这样的专用处理器几乎没有系列产品,其下一代升级版可能是一个功能强得多的产品,而实际需要的仅是增加少量功能,这种升级的处理器不仅增加了成本,也造成资源浪费。另一种替代作法是增加更多芯片进行外部加速,但这增加了I/O处理瓶颈。
不过,带多个软嵌入式处理器的FPGA提供了一个避免这种软硬件能力不平衡的方法。因FPGA是可编程的,所以能非常精确地调配硬件资源以满足软件需要。
另外,因FPGA具有如此广泛的适用性,所以在经济上,允许它提供一系列完整的各种容量的产品;这样,若一款器件容量不满足要求,能换用一款性能相尽、能够满足需要又没太多浪费的器件。通过观察数据包处理子系统,能方便地说明这种情况,该子系统常常用专用多核处理单元来满足高达数千兆赫的线速处理需求。
在多核处理的讨论中,“内核”、“处理器”和“引擎”等词可能要多次提及,它们有时是一个意思,有时却不是。为清楚起见,本文将用“内核”特指微处理器、连同在多核配置中被多次运行的支持逻辑和存储器。“引擎”表示由一个核或更多核组成的架构。而“处理器”一词则用于代表传统意义上的单个CPU。
剖析一个多核包处理器
在一个包处理引擎中要用到不同硬件,包括:端口、快速通道引擎、控制面处理器、代码和数据存储、加速器、外部存储控制器和外设。
所有这些器件都能在一个FPGA中实现。在某些场合,硬件成本以逻辑门计算,而另一些场合则以存储器计算,还有一些场合还可能以芯片管脚计算。而大多情况则这些成本全部都要考虑。
永远存在这样一个限制:整体所用资源必须不能超过给定器件所能提供的容量;但设计的动力来自于能对门这样的底层资源进行配置,使其服务于一种或另外的功能,而不是专用于某种可能用到也可能永远用不到的功能上。
在基于多核或多处理器的设计中,特别是在包处理系统中,软核PFGA方案的好处在快速通道引擎、控制面处理器以及在这样的环境中如何配置加速器等方面,是最显而易见的。
快速通道引擎
为得到最高性能,包处理器的快速通道引擎通常是由多核构造实现的。所需核的数量取决于所需的功能,且随具体应用而异。即使对一个给定的应用,诸如线利用率、包大小这些决定性能的参数及包的混合会影响所需的核数量。
在配置固定的情况下,一个固定架构通常允许访问一个固定的内核组。这时,用户的任务是以这样一种方式进行代码划分:在流水线及代码存储的限制内,平衡各内核的使用。
如性能要求不高,则不用或少用某些核。相反,如果提供的核数量最后不能满足性能和预留扩展的要求,则必须选用一款大容量器件。通常,这种器件的内核数量将多一倍。
除非最初对核的估计相差太远,为满足性能要求所需增加的核将只是一到两个。例如,对于只需增加一个核的情况,若将原来的4个核翻番为8个核,则有“牛刀杀鸡”之嫌。
一个灵活的多核构造为解决这一问题提供了一条全新途径。即人们能根据软件需要指配核数量,而不是试图将软件硬塞进一个固定数量的处理器内。通过了解代码所需的大概周期数及总体周期预算,就能确定这些要求。
假定有了上述信息,就能正确估算所需的核数量。即使以后需要增加一个核,如果FPGA有足够资源的话,实际上就变成在FPGA设计时,简单添加一个核而已。另外,如必须升级器件的话,也无需使资源加倍就可实现。
可编程结构的另一个好处是能以不同配置生成流水线,以平衡流水线的各不同级。而生成精确平分周期数的流水线是非常困难的。
其结果是:某些级将比其它级需要更多周期,从而使这些级失去平衡。实际上,一个慢速级也许需要三个并行核以满足周期预算;而一个邻近的快速级可能只需2个核。只要互连通信模块能提供负载平衡,这在FPGA中能够很容易地进行调节。
控制面处理器
在绝大多数的网络和通信处理器中,有一个处理器被计划用作控制面处理器。这时,必须使控制面代码适应此处理器。
虽然某些FPGA有内置处理器(Xilinx Virtex 4 FX系列包含一或两个PowerPC处理器),实际上,任何FPGA都可以使用,而且任何处理器都能连至该FPGA。
虽然一个外接控制面处理器将占用一些电路板面积并需要芯片间的I/O接口,但这时FPGA就不用必须包含处理器了。所以这是一个真正的折衷。采用一个固定架构,可以决定该控制面处理器是否使用,而且在外接处理器中,并没一个现成的挂接方法。
硬件加速
硬件加速对许多算法至关重要。以下两类功能必须进行加速:
(1)计算量很大的功能,诸如加密或校验计算;
(2)长引导时间的项目,如外部存储器访问。
加速的目的是对慢速项目进行加速。但对于固定架构方案,却存在以下三方面的问题:
1. 无论是否需要,任何现有片上加速器都存在;
2. 一般来说,加速器必须被共享;
3.加速器非内置就必须采用独立芯片实现。
对于第一种情况,是各种可能浪费芯片资源中的一种。例如,某些网络处理器将提供校验和加速器。如果一个具体应用不需要校验和,则该部分硅片徒增了成本却没增加价值。
假定校验和有两个并行核,则这两个核都需要访问加速器,所以该加速器要由这两个核来共享。如果加速器的占空比与周期预算相比要短,则共享加速器会取得好效果。
但如果占空比长,则因不同内核试图访问同一加速器造成的竞争,而损害整体性能。工程师需要灵活性,来决定是否共享以及如何共享加速器。
另一种情形是,应用需要校验和,而速率要求快于内置加速器所能提供的速率。或者可能应用不需要校验和,但却需要某些其它种类的加速。这时,必须借助外加芯片进行加速,或采用市面上现成的加速器或在FPGA上构造出一个加速器。
由于片外的开销,通常这种加速器必须被共享,它意味着,因为竞用和片外开销,性能会受到双重影响。而与此同时,内置加速器却闲置没用。
采用FPGA,借助于该技术固有的灵活性,上述问题能轻易地得到解决。对于上述三方面的问题,分别对应的解决方案为:1.只生成需要的加速器;2.可共享也可不共享加速器;3.加速器与使用它的内核都在同一片上实现。
所以,如果应用不需要校验和,则不生成校验和加速器。如果应用需要校验和,且能容忍共享,则共享是可能的;但若共享影响性能,则可生成多个加速器,使每个核有一个专用加速器。这样,因加速器做在同一个FPGA上,就不再有片外延时。
FPGA允许更高一级的灵活性:即对被加速功能的调度。在传统意义上,“加速器”是同步的:即调用加速器的内核在继续运行前,等待调用结果。
另一种选择是异步的协处理器:调用加速器的内核在协处理器工作时,能运行其它任务。但作为面向软件的单元时,“协处理器”一词很容易产生混淆。因此,Teja公司采用“卸载”一词,表明一个从内核传递至硬件单元的功能。FPGA内的卸载既可设计为同步的,又可设计为异步的;这是一个在设计时做出的工程决定。
找到和谐
硬件在各方面具有的广泛灵活性,允许系统实现最佳的性价比平衡。这些决策的控制权掌握在设计系统的工程师手中。
通过继续将大量的处理算法在软件中实现,并将其与灵活的硬件结合起来,则在系统中,那些非此即彼的苛刻限制就会减少,它意味着好的工程决定将允许更迅速地实现向线速的收敛。
另外,因只将所需硬件实例化(instantiated),所以设计师能很明确地进行成本控制并权衡性价比。因协调得更彻底,软件和硬件间的交互取舍就变得更其乐融融——有时是软件随硬件之便,有时是硬件助软件之力;但并不试图相互控制、也并非相互依赖、没有了挥之不去的纷争;软硬件都能以一种愉悦的密切配合的方式共存、共享长久有益的“生命”。
作者:Bryon Moyer
营销副总裁
Teja Technologies公司