嵌入式开发技巧:利用编程技术发挥多内核架构优势
扫描二维码
随时随地手机看文章
在整个嵌入式领域,“更多内核”已经成为设计趋势,一些硬件架构可以提供数十个内核,有些架构中的内核甚至多达上千个。然而,多内核设计在软件方面仍存在诸多挑战,在不同架构间进行应用程序的移植并不容易。
在低端嵌入式领域,单内核解决方案仍然存在。通过采用速度更快或带宽更宽的处理器仍有可能提升系统的功能和性能曲线。在高端领域,多内核是必然的发展方向。这正是双精度浮点算法经常出现并在超级计算机中长盛不衰的原因。事实上,台式机和机架安装系统(比如Nvidia的产品)正在将这种处理能力普及化。
在讨论软件和多内核架构时经常提及的另一个问题是虚拟化。并不是所有多内核平台都支持虚拟化,但虚拟化确实能带来更好的机会。虽然虚拟化使得硬件设计面临更多的挑战,但它通常能简化软件和应用管理。
SMP服务器
Xeon Nehalem-EX是Intel公司提供的顶级8内核对称多处理(SMP)平台。像8芯片、64内核系统这样的多芯片解决方案,通常采用高速 QuickPath点到点互连技术将处理器和外设控制器链接在一起(图1)。使用过带HyperTransport链路的AMD Opteron处理器的工程师,对这种架构非常熟悉。在这两种情况下,最简单的配置是单个处理器通过单条高速链路链接到单个外设控制器。
除了提供分布式内存子系统外,Intel和AMD还实现了连贯缓冲非统一内存寻址(ccNUMA)技术。每个处理器芯片都有自己的内存控制器以及一级、二级和三级缓存。任何芯片都可以使用高速链路访问其它任何芯片中的内存。当然,离请求者越远的数据访问时间越长。这些高速链路也被用于消费设备,但只有到 I/O中心的单条链路是必需的。换句话说,在共享内存访问时服务器将在处理器芯片间产生显着的流量。芯片至芯片流量和缓存管理是高效操作的关键。
HT Assist是AMD最新推出的Istanbul Opteron处理器的一个重要功能,它通过优化内存请求和响应过程来尽量减少相关事务处理的数量,进而释放出大量带宽用于处理其它业务(图2)。HT Assist实际上会跟踪数据在内核和缓存间的移动,允许请求得到具有所需数据的最近内核的服务。
最坏的情况是拥有片外存储器空间的芯片必须从片外存储器访问数据;最好的情况是发现数据正好位于运行着需要这个数据的线程的芯片缓存中;中间情况是内核从相邻芯片的缓存中获取数据。使用虚拟化和缓存技术后系统将变得更加复杂,并导致数据延时更加难以确定。这在确定性嵌入式应用中可能是个问题,但在大多数服务器应用中问题并不十分明显,因为这种情况下的速度比精细的确定性更加重要。
编程人员现在都在使用这些平台,因为它们能大大简化编程任务。同样,应用程序可以使用越来越多的内核,前提是应用程序可高效地利用充足的线程。高效使用多内核系统并不像表面看起来那么容易。缓存大小和应用程序工作数据集中的参考位置会影响特定算法的运行效果。
AMP应用处理器
对称处理(SMP)架构对许多嵌入式应用来说非常有用,但非对称多处理(AMP)也有它的用武之地。AMP配置在很多地方都可以看到,从TI的OMAP(开放多媒体应用平台)到飞思卡尔的P4080 QorIQ都有AMP的身影(图3)。
TI的OMAP 44xx平台整合了ARM Cortex-A9、PowerVR SGX 540 GPU、C64x DSP和图像信号处理器。每个内核有专门的功能,处理器之间的通信不是对称的。OMAP只工作在AMP模式,而P4080的内核是SMP系统,但也能够将内核划分为AMP模式。8内核芯片可以像8个独立内核那样运行,在许多配置中也可以联合起来使用(如一对双内核SMP子系统,或四个单内核子系统)。
OMAP和P4080在高层架构的主要区别是OMAP功能是固定的,内核针对各自的事务做了优化。这将使编程容易得多,因为可以根据匹配功能将应用程序划分到特定内核。
每个子系统的性能水平受架构的限制,但P4080可以调整划分方案,虽然划分通常是在系统启动时完成的。系统设计师可以调整P4080中内核的分配,前提是有足够多的内核。市场上也有内核数量较少的QorIQ平台,因此可以选用更经济的芯片。
IBM的Cell处理器填补了中间的空白。它采用了1个64位的Power内核和8个增效处理单元(SPE)。所有SPE都是相同的(每个有256KB的内存),它们工作在隔离状态,这与上述讨论的共享内存SMP系统有所不同。SPE内没有缓存,也不支持虚拟内存。
对软硬件设计来说,这种方式既有优点又有缺点。优点为是简化了硬件实现,但从多个角度看都使软件复杂化了。例如,内存管理受应用程序控制,就像内核间的通信一样。数据在能够操作之前必须要移进SPE的本地内存。完全开发Cell这样的架构很花时间,因为它们有别于更传统的SMP或AMP平台。多年来在像索尼的PlayStation 3这样的基于Cell的平台上所作的软件改进突显了编程技术和经验的变化。
GPU等专用处理器
改变编程技术是使用图形处理单元(GPU)是否成功的关健。来自ATI和Nvidia等公司的GPU在单个芯片内有上百个内核,这些GPU可以被整合进多芯片解决方案,向开发人员提供上千个内核。例如,集成进1U机箱的4个Nvidia Tesla T10就可以提供960个内核(图4)。
对Tesla或其它任何兼容的Nvidia GPU芯片进行编程都极具挑战性,但类似Nvidia的CUDA这样的架构或基于CUDA的运行时利用可以使工作变得更加轻松。部分挑战来自于 Nvidia GPU的单指令、多线程(SIMT)架构。与许多高性能系统一样,这种GPU喜欢处理数组数据。对许多应用来说这是不错的选择,但并非都是这样,这正是 GPU经常要与多内核CPU匹配的原因之一。[!--empirenews.page--]
另一种并行编程架构,CUDA和OpenCL(开放计算语言),则完全匹配GPU方法(使用与主处理器分开的存储器)。这意味着数据在能被操作之前必须从一个地方移动到另一个地方。C编程语言有一定扩展,但也有限制。例如,它是自由递归的,不支持函数指针。其中一些限制源自SIMT方法。
许多应用程序使用CUDA,但与传统SMP平台相比,性能增益有很大的变化,从2倍到100倍不等。造成这种变化的原因是,线程以32为组运行时的效率最高。分支不影响性能,前提是32线程组在同一分支内。
像GPU这样的专用处理器,其采用的方案是同时提供图形和多内核处理。另外一种方案是使用许多传统内核,如Intel的Larrabee(图5)。Larrabee使用专门针对矢量处理优化过的x86兼容内核。
从某种角度看,Larrabee有点类似于IBM的Cell处理器。Larrabee内核只有32KB的一级缓存和256KB的二级缓存可以访问。如果数据不在缓存中,必须从内存控制器或系统中的另一个缓存中申请,然后数据被放进内核的缓存中,再由应用程序继续处理。
环形总线用于内核和控制器之间的通信。IBM的Cell单元互连总线(EIB)也是一种环形总线,连接着 SPE和内存控制器以及外设接口。从编程角度看,Larabee的缓存和Cell的SRAM有很大的差异。诚然,对编程人员来说,Larrabee看起来更像是一组连贯缓存的x86处理器。由于其GPU定位,编程人员可以充分利用它对DirectX和OpenGL的支持。
多内核联网
多内核芯片也是网络基础设施中的常见元件。处理10Gps的网络对多内核芯片来说本身就是很大的挑战。分析和处理来自线速网络连接的数据需要大量的处理资源。
Netronome的NFP-3200网络流量处理器包含40个1.4GHz的内核,每个内核可以运行8个线程,因此1个芯片总共可提供320个基于硬件的线程。这个数量级与GPU相同,但这些处理器主要用于数据包处理。
与IBM的Cell一样,NFP-3200也有一个主CPU型控制器,而且是一个ARM11内核。NFP-3200的40个内核也叫做微引擎,兼容 Intel的IXP28xx架构,主要用于网络处理。这种兼容性很重要,因为大量代码是针对这种架构开发的。较老的芯片具有较少的内核,因此在某种意义上 NFP-3200提供的是相同解决方案。
当然,为解决问题而简单地采用更多的内核只是其中一种措施。Netronome作了大量改进,例如支持TCP任务卸载的增强型微模块。互连速度也更高了,内核之间的运行速度高达44Gbps。
Netronome芯片拥有大量的专用处理器,其中包括了用于处理各种安全协议的加密系统。Netronome的PCI Express接口支持x86处理器经常使用的I/O虚拟化功能。它能被移动到NFP-3200旁边,而不是被另外一条网络链路隔开。
与其它多内核芯片相比,编程NFP-3200通常没有太大问题,因为针对IXP28xx系列有大量现成代码。另外,Netronome提供库,这使得网络处理应用程序的创建更像是模块的堆叠。
Cavium的Octeon II是一种更传统的SMP多内核设计,有2到6个64位 MIPS64内核,它们通过一个交叉开关相连。与Netronome芯片一样,Octeon II是针对网络和存储设备设计的。
Octeon II还有一个RAID 5/6加速器以及用于数据包检查的正则表达式超有限时序机(HFA)。编程Octeon II与编程大多数SMP系统相仿。Octeon II可以运行诸如Linux的操作系统。
其它多内核架构
采用更激进的多内核架构会增加编程事务,但它能为开发人员开启利用新架构的机会。IntellaSys的SeaFORTH 40C18就属于这种类型(图6)。它本身的编程语言是VentrueForth,指令长度实际上是5位,4个指令可以压缩为单个18位的字(一个指令只有3位长)。40C18有40个内核,它们有相同的处理单元,并且都有64个字的RAM和64个字的ROM。
与具有更多存储空间的芯片(如Intel的Larrabee或IBM的Cell)相比,对40C18进行编程显然有很大的区别。40C18内核的功耗不到9mW,而其它两种芯片在没有大散热器或风扇的情况下都无法正常工作。40C18设计用于嵌入式甚至移动应用。
对大多数开发人员来说,对40C18进行编程将是不同的体验,这不仅因为Forth是编程语言。每个内核的小内存容量和矩阵互连改变了程序设计方法。内核通常运行将数据传送到一个或多个相邻内核的小型函数,因此协同编程将是大势所趋。
即使外部存储器访问也要求三个内核一起工作,当有许多内核可以一起工作时这种方法很管用。40C18还有一种独特的能力,它能将4个指令组成的小程序用一个字发送给相邻内核执行,因此就有足够的空间执行块传送。
XMOS公司的XS1-G4是一种基于32位整数Xcores的有趣混合产品。每个Xcore可以处理大量不同的线程,同时还有一个基于硬件的事件系统帮助XMOS的软外设。与40C18一样,XS1-G4可以在I/O端口上等待。区别是XS1-G4处理多个线程,而IntellaSys芯片处理单个线程。
开发人员可以使用C语言的扩展版本XC发挥XMOS硬件的最大功效。C语言扩展提供了到硬件支持的快捷路径,其中也包括 Xlinks。Xlinks连接芯片中的4个内核,并提供4个片外链路,因此可以连接多个芯片。芯片内部使用一个开关用于Xlink连接,但硬件和软件为处理器间通信提供统一接口。
每个内核有64KB的内存,这个容量比40C18大,但比本文提到的一些更高性能的芯片的内存容量小。同样,对大部分应用代码来说这个容量是足够用的,并且允许使用更传统的线程方法进行编程。针对XMOS芯片的大部分编程工作很可能用传统的C或C++完成,而不是用XC,后者更倾向用于通信和外设处理。
XS1-G4不会向双精度浮点GPU或其它高端系统提出挑战,但它的整数和定点DSP支持使得它适用于其它许多音频和视频处理功能。链接好的XMOS芯片早已在内部用来驱动多个大屏幕LCD。
多内核架构还将继续保持高速发展。高效地对这些内核进行编程和选择合适的产品并不容易,但它会变得越来越普及,即使是对嵌入式开发人员而言。传统应用程序将不断地移植到匹配现有主机的架构上。当应用程序被重新设计或从头创建时,也许会有更好的方案产生。[!--empirenews.page--]