Cortex-a8 arm11 arm9 xscale powerpc 嵌入式处理器实测性能
- UID
- 1066743
|
Cortex-a8 arm11 arm9 xscale powerpc 嵌入式处理器实测性能
嵌入式处理器层出不穷,系列和种类繁多。经常在嵌入式产业界见到的处理器,仅指令集家族就有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性能。
测试软件简介nbenchnbench是一个简单的用于测试处理器,存储器性能的基准测试程序。即著名的BYTE Magazine杂志的BYTEmark benchmark program。nbench在系统中运行并将结果和一台运行Linux的AMD K6-233电脑比较,得到的比值作为性能指数。由于是完全开源的,爱好者可以在各种平台和操作系统上运行nbench,并进行优化和测试,是一个简单有效的性能测试工具。nbench的结果主要分为MEM、INT和FP,其中MEM指数主要体现处理器总线、CACHE和存储器性能,INT当然是整数处理性能,FP则体现双精度浮点性能(大多数嵌入式处理器都没有强大的双精度浮点能力)。
fp_firfp_fir是笔者编写的单精度浮点FIR性能测试程序,简单并直观的评价系统的单精度浮点数乘加性能(玩过DSP就知道,浮点乘加是TigerSHARC的拿手好戏)。fp_fir的一个亮点是可以很容易的SIMD向量化,即利用SSE3/Altivec/Neon等SIMD指令集加速执行。这个测试的结果也是最有戏剧性的。
1.nbench测试MEM部分此测试包括字符排序、数据赋值和位操作。这个测试中,高主频、高速的片内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 存储器性能
2.nbench测试INT部分
此测试包含整数排序,模拟浮点运算,霍夫曼编码,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 整数性能
3.nbench测试FP部分
此测试包括双精度浮点傅立叶变换、神经网络、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 双精度浮点性能
4.fp_fir测试
表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
表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
可以看到流水线化的向量协处理对数值运算帮助非常大,有数量级的性能提升。这也是为什么INTEL/AMD等处理器厂商都把多媒体指令集作为亮点大肆宣传,各种操作系统和软件也积极应用SIMD指令来进行加速。
因为嵌入式处理器原本就没有集成全流水线FPU,这种加速对嵌入式处理器如cortex-a8尤其明显。
此外,嵌入式处理器指令集兼容的历史包袱比x86要少得多,完全可以直接采用向量指令集得到接近大型CPU和传统高端DSP的数值计算性能,有的嵌入式CPU干脆把这类指令叫做嵌入式DSP指令。这类向量指令集在视频图像处理、语音识别、计算机视觉、软件无线电和人工智能等应用上拥有极大的性能/功耗比优势。 |
|
|
|
|
|