嵌入式处理器层出不穷,系列和种类繁多。经常在嵌入式产业界见到的处理器,仅指令集家族就有x86,arm,powerpc,mips,sh等。每种指令集往往又有很多系列,下面还有不同版本,甚至同一版本有不同芯片厂家实现产品。这还不够,再加上不同的主频、总线结构、存储器cache配置,即使在行业里打拼多年的专业人士也难免眼花缭乱。
所以,经常有人会问:200Mhz的arm9比起嵌入式工控机上的赛扬有多大的性能差距?四千多买的500MHz的智能手机究竟比笔记本电脑慢多少?
在短时间内全面解释这类问题,介绍清楚各种嵌入式处理器的来龙去脉是不可能的。笔者前日对手里的几个嵌入式处理器进行了性能评测,获得了一些有趣儿的结果,能够一定程度上说明问题,于是撰文跟大家分享。
涉及的对象包括arm家族常用的系列嵌入式处理器,从初学者都知道的S3C2410到基于arm1136jf-s的OMAP2420,还有新一代产品新宠OMAP3/Cortex-a8。软件运行的操作系统为linux-2.6.24以及之后版本和gcc-4编译器。最终的测试结果说明了目前嵌入式处理器的性能现状,可供感兴趣的读者参考,最后还提供了笔者使用的测试代码下载。笔者也非常希望爱好者在自己的嵌入式平台上测试,并将结果发帖交流。
本文的内容主要基于笔者亲自测试的结果,也有部分结果来自于他人的测试,绝大多数的测试对于稍有嵌入式Linux经验的人都可以很容易的重复。测试项目包括 nbench 整数性能,nbench内存带宽,nbench双精度浮点性能,单精度浮点FIR性能,SIMD向量单精度浮点FIR性能。
nbench是一个简单的用于测试处理器,存储器性能的基准测试程序。即著名的BYTE Magazine杂志的BYTEmark benchmark program。nbench在系统中运行并将结果和一台运行Linux的AMD K6-233电脑比较,得到的比值作为性能指数。由于是完全开源的,爱好者可以在各种平台和操作系统上运行nbench,并进行优化和测试,是一个简单有效的性能测试工具。nbench的结果主要分为MEM、INT和FP,其中MEM指数主要体现处理器总线、CACHE和存储器性能,INT当然是整数处理性能,FP则体现双精度浮点性能(大多数嵌入式处理器都没有强大的双精度浮点能力)。
fp_fir是笔者编写的单精度浮点FIR性能测试程序,简单并直观的评价系统的单精度浮点数乘加性能(玩过DSP就知道,浮点乘加是TigerSHARC的拿手好戏)。fp_fir的一个亮点是可以很容易的SIMD向量化,即利用SSE3/Altivec/Neon等SIMD指令集加速执行。这个测试的结果也是最有戏剧性的。
此测试包括字符排序、数据赋值和位操作。这个测试中,高主频、高速的片内CACHE和快速的外存储器非常重要。采用新架构的Cortex-a8和强劲的桌面x86占有很大优势,其中很大一部分是源于片上的二级CACHE结构
具体分数如下
表1 nbench 存储器性能
处理器名称 | MEM性能指数(越大越好) |
Pentium MMX 166MHZ | 0.51 |
S3C2410 200MHz | 0.67 |
PXA255 400MHz | 0.94 |
PXA270 520MHz | 1.16 |
OMAP2420 400MHz | 1.17 |
PPC440 400MHz | 1.46 |
PentiumIII 800MHz | 3.74 |
OMAP3530 600MHz | 3.04 |
图1 nbench 存储器性能
此测试包含整数排序,模拟浮点运算,霍夫曼编码,IDEA加密算法。在此测试里,主频是最主要的性能因素,指令集的并行度也有很大影响,所以超标量处理器PentiumIII和Cortex-a8的优势不仅来自于主频,也来自于单周期执行多条指令、分支预测等综合能力。但是更老的PPC440也是双发射的超标量CPU,不过并没有体现太大优势,一方面是PPC440的ALU指令并不能双发,另一方面也是因为通用整数运算内在的并行度并不高,指令级并行受限较多,并行加速不如主频提高明显。
表2 nbench 整数性能
处理器名称 | INT性能指数(越大越好) |
Pentium MMX 166MHZ | 0.53 |
S3C2410 200MHz | 0.76 |
PXA255 400MHz | 1.26 |
PXA270 520MHz | 1.82 |
OMAP2420 400MHz | 1.86 |
PPC440 400MHz | 1.67 |
PentiumIII 800MHz | 3.39 |
OMAP3530 600MHz | 3.57 |
图2 nbench 整数性能
此测试包括双精度浮点傅立叶变换、神经网络、LU分解。在此测试里面桌面处理器一枝独秀,主要是因为PentiumIII拥有强大的SSE浮点处理能力,双精度浮点硬件流水线性能远超其他处理器,尤其是只有传统标量整数指令集的嵌入式处理器,如S3C2410和PPC440。
低功耗的嵌入式处理器一般不会集成双精度流水线FPU,主要是因为硅片面积和功耗较大,实现浮点处理靠另外的方法。
S3C2410(ARM920T)和PPC440利用softfloat库实现浮点处理,性能是最低的。(当然,仅仅是比其他的高级处理器低,虽然只有K6-233性能的百分之几。如果你测试很多S3C2410开发板自带的oabi gcc-2.95硬浮点工具链,加上内核NWFPE模拟浮点指令,会得到更惨的结果。oabi+NWFPE性能只有softfloat的10到20分之一,是向量浮点的几千分之一)
XSCALE以及其他ARMV5TE以上的处理器可以利用定点向量指令加快softfloat库模拟,其中支持iWMMXT的PXA270可以使用64位定点向量指令显著加快速度。
新的ARM处理器如OMAP2420集成硬件了VFP,虽然不是桌面CPU规模的流水线FPU,还是比软件模拟快很多。
也许读者会奇怪OMAP3 600MHz的浮点性能比OMAP2 400MHz还低,这是因为Cortex-a8比arm11进一步简化了VFP的硬件以降低功耗和面积,并引入了如同Pentium4处理器的向量指令集neon。该指令集最大数据宽度和SSE3一样为128bit,可以支持完全流水的向量定点和单精度浮点处理,仅仅比SSE3少了双精度浮点流水处理。由于nbench进行双精度浮点测试,并且使用glibc内建的未优化的数学库,所以无法发挥neon的性能。
表3 nbench 双精度浮点性能
处理器名称 | FP性能指数(越大越好) |
Pentium MMX 166MHZ | 0.85 |
S3C2410 200MHz | 0.01 |
PXA255 400MHz | 0.59 |
PXA270 520MHz | 0.99 |
OMAP2420 400MHz | 1.43 |
PPC440 400MHz | 0.04 |
PentiumIII 800MHz | 6.62 |
OMAP3530 600MHz | 0.98 |
图3 nbench 双精度浮点性能
在fp_fir测试中,为了对Cortex-a8的noen向量处理能力进行对比,加入了高性能的处理器PentiumD 920 3.0GHz的对比评测。该系统配备2GB双通道DDR2内存,运行Linux-2.6.27 x86_64 64-bits系统。同样,也加入了基于老式arm920t的S3C2410“陪太子读书”
需要知道的是PentiumD 920除了拥有嵌入式处理器难以企及的3GHz主频,更有2MB L2CACHE和800MHz 64-bits前端总线,并且同样集成了SSE3 128-bit SIMD指令集。
表4 测试平台功能对比
功能 |
OMAP2420/arm1136jf-s 指令集 arm v6 |
OMAP3530/Cortex-a8 指令集 arm v7a |
PentiumD 920 代号Presler 指令集x86_64 |
工艺 | 90nm 标准单元 | 65 nm 标准单元 | 65nm Intel custom |
主频 | 400MHz | 600Mhz | 3.0GHz |
L1 cache | 16KB I-cache 16KB D-cache | 16KB I-cache 16KB D-cache | 12KB Trace I-cache 16KB D-cache |
L2 cache | 无 | 256KB | 每核心2MB |
运行平台 | 32-bits armv6el linux-2.6.21 glibc-2.5 gcc-4.1.2 | 32-bits armv7el linux-2.6.28 glibc-2.7 gcc-4.3.2 | 64-bits x86_64 linux-2.6.27 glibc-2.7 gcc-4.3.2 |
传统FPU | 非流水VFP | 非流水VFP | 深流水线FPU |
SIMD FPU | 无 | 流水线neon 128-bits向量单精度浮点 | 深流水线sse3 128-bits向量单精度和双精度浮点 |
片上多处理 | arm1136 + C55x DSP | Cortex-a8 + C64x DSP | x86_64双核SMP |
图形加速 | 集成 MBX 3D加速 IVA视频加速 | 集成 SGX 3D加速 IVA2视频加速 | 无内置 |
本次测试将fp_fir程序分别编译到不同平台上,分为9中不同的CPU与配置组合
表5 测试配置和编译选项
配置名称 |
编译配置 |
S3C2410 200MHz softfloat | 采用软浮点库,编译选项 -mcpu=arm920t -mtune=arm920t -O3 -msoft-float -ffast-math |
OMAP2420 400MHz softfloat | 采用软浮点库,编译选项 -mcpu=arm1136jf-s -mtune=arm1136jf-s -O3 -msoft-float -ffast-math |
OMAP2420 400MHz vfp | 采用VFP硬件浮点,编译选项 -mcpu=arm1136jf-s -mtune=arm1136jf-s -O3 -mfloat-abi=softfp -mfpu=vfp -ffast-math |
OMAP3530 600MHz vfp | 采用VFP硬件浮点,编译选项 -mcpu=cortex-a8 -mtune=cortex-a8 -O3 -mfloat-abi=softfp -mfpu=vfp -ffast-math |
OMAP3530 600MHz auto vectorized | 采用neon向量浮点,gcc-4.3.2自动生成neon向量指令,编译选项 -mcpu=cortex-a8 -mtune=cortex-a8 -O3 -mfloat-abi=softfp -mfpu=neon -ftree-vectorize -ffast-math |
OMAP3530 600MHz manual vectorized | 采用手工编写的汇编函数,人工调用neon向量浮点指令,编译选项 -mcpu=cortex-a8 -mtune=cortex-a8 -O3 -mfloat-abi=softfp |
PentiumD920 3.0GHz scalar fpu | 采用FPU硬件浮点,编译选项 -march=nocona -O3 |
PentiumD920 3.0GHz SSE3 vectorized | 采用sse3向量浮点,gcc-4.3.2自动生成sse3向量指令,编译选项 -march=nocona -O3 -ftree-vectorize -ffast-math -mfpmath=sse -mmmx -msse -msse2 -msse3 |
新版本gcc-4.3已经加入了neon向量指令支持,而对sse的支持在更早版本中就已经加入了。要启用向量指令自动生成功能,需要在编译参数中加入适当的处理器指令集标记和浮点选择标记,在arm架构下为
-mfloat-abi=softfp -mfpu=neon -ftree-vectorize -ffast-math
在x86架构下为
-mfpmath=sse -ftree-vectorize -mmmx -msse -msse2 -msse3 -ffast-math
另外,在arm linux平台下,如果使用的是EABI(embedded application binary interface)配置则允许系统中混合运行softfp,vfp,neon向量浮点等各种浮点实现代码。例如在cortex-a8上运行同时运行优化的向量浮点代码和老式arm920t的软浮点代码,这使得上述测试能够方便的完成。如果用老的oabi环境,切换不同的浮点配置必须把全部的用户代码重新编译。
下载地址在这里可以找到。
表6 fp_fir 单精度浮点乘加性能
处理器名称 | 1M samples 1024点单精度浮点FIR用时(越小越好):秒 |
S3C2410 200MHz softfloat |
1175.22 |
OMAP2420 400MHz softfloat |
248.39 |
OMAP2420 400MHz vfp |
34.45 |
OMAP3530 600MHz vfp |
53.17 |
OMAP3530 600MHz auto vectorized |
6.98 |
OMAP3530 600MHz manual vectorized |
2.99 |
PentiumD920 3.0GHz scalar fpu |
6.91 |
PentiumD920 3.0GHz SSE3 vectorized |
0.95 |
图4 fp_fir 单精度浮点乘加性能 单位:秒 越小越好
由于向量处理和传统非流水标量处理性能差距很大,去掉前面5种地性能的配置。截取后4种向量处理配置的柱状图,可以清晰的看到neon和sse3性能PK
图5 fp_fir 单精度浮点乘加性能 单位:秒 越小越好
可以看到流水线化的向量协处理对数值运算帮助非常大,有数量级的性能提升。这也是为什么INTEL/AMD等处理器厂商都把多媒体指令集作为亮点大肆宣传,各种操作系统和软件也积极应用SIMD指令来进行加速。
因为嵌入式处理器原本就没有集成全流水线FPU,这种加速对嵌入式处理器如cortex-a8尤其明显。
此外,嵌入式处理器指令集兼容的历史包袱比x86要少得多,完全可以直接采用向量指令集得到接近大型CPU和传统高端DSP的数值计算性能,有的嵌入式CPU干脆把这类指令叫做嵌入式DSP指令。这类向量指令集在视频图像处理、语音识别、计算机视觉、软件无线电和人工智能等应用上拥有极大的性能/功耗比优势。
由此可见,新式的嵌入式处理器实现了一系列同等于原来桌面处理器才有的功能,性能也可以在某种程度上接近传统的桌面处理器,同时保持了极低的功耗。