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性能。
测试软件简介
nbench
nbench是一个简单的用于测试处理器,存储器性能的基准测试程序。即著名的BYTE Magazine杂志的BYTEmark benchmark program。nbench在系统中运行并将结果和一台运行Linux的AMD K6-233电脑比较,得到的比值作为性能指数。由于是完全开源的,爱好者可以在各种平台和操作系统上运行nbench,并进行优化和测试,是一个简单有效的性能测试工具。nbench的结果主要分为MEM、INT和FP,其中MEM指数主要体现处理器总线、CACHE和存储器性能,INT当然是整数处理性能,FP则体现双精度浮点性能(大多数嵌入式处理器都没有强大的双精度浮点能力)。
fp_fir
fp_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 存储器性能
http://forum.linuxbj.com/files/images/nbench_mem.png
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 整数性能
http://forum.linuxbj.com/files/images/nbench_int.png
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 双精度浮点性能
http://forum.linuxbj.com/files/images/nbench_double.png
4.fp_fir测试
在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 单精度浮点乘加性能 单位:秒 越小越好
http://forum.linuxbj.com/files/images/nbench_fir.png
由于向量处理和传统非流水标量处理性能差距很大,去掉前面5种地性能的配置。截取后4种向量处理配置的柱状图,可以清晰的看到neon和sse3性能PK
图5 fp_fir 单精度浮点乘加性能 单位:秒 越小越好
http://forum.linuxbj.com/files/images/nbench_fir_vect.png
可以看到流水线化的向量协处理对数值运算帮助非常大,有数量级的性能提升。这也是为什么INTEL/AMD等处理器厂商都把多媒体指令集作为亮点大肆宣传,各种操作系统和软件也积极应用SIMD指令来进行加速。
因为嵌入式处理器原本就没有集成全流水线FPU,这种加速对嵌入式处理器如cortex-a8尤其明显。
此外,嵌入式处理器指令集兼容的历史包袱比x86要少得多,完全可以直接采用向量指令集得到接近大型CPU和传统高端DSP的数值计算性能,有的嵌入式CPU干脆把这类指令叫做嵌入式DSP指令。这类向量指令集在视频图像处理、语音识别、计算机视觉、软件无线电和人工智能等应用上拥有极大的性能/功耗比优势。
由此可见,新式的嵌入式处理器实现了一系列同等于原来桌面处理器才有的功能,性能也可以在某种程度上接近传统的桌面处理器,同时保持了极低的功耗。
文中提到的测试代码下载请见:
本文作者:周明 原载于嵌入式技术博客,请尊重作者劳动,欢迎转载但需注明原文链接!
- Weblog von zhoum
- Anmelden oder Registrieren um Kommentare zu schreiben
请问周老师的QQ或者MSN号是多少啊?
方便向周老师学习
用nbench测Intel凌动Atom330的性能
周老师您好,我用nbench测了Intel凌动Atom330的性能
硬件平台:
Intel凌动Atom330 1.6GHz
Dual Core 双核
Hyper-Threading Technology 超线程
533-MHz Source-Synchronous front side bus (FSB) 533MHz前端总线
On die 512-kB, 8-way L2 cache, per core: total of 1 MB cache 512k*2二级缓存
Streaming SIMD Extensions 2 and 3 (SSE2 and SSE3) and
Supplemental Streaming SIMD Extensions 3 (SSSE3) support 支持SSE,SSE2,SSE3,SSSE3指令集
Intel EM64T 支持EM64T的64位指令
Intel 945G主板
单条1G DDR2 667 SDRAM
软件平台:
Fedora Core 9 命令行界面
定制的linux-2.6.28.10内核
gcc-4.3.0
glibc-2.8-3.i686
nbench-2.2.3
nbench的Makefile的CFLAGS设置:
CFLAGS = -s -static -Wall -O3 -march=core2 -ftree-vectorize -ffast-math -mfpmath=sse -mmmx -msse -msse2 -msse3 -mssse3
gcc手册上说-march=core2是带有64位扩展,MMX,SSE,SSE2,SSE3,SSSE3指令集支持的Intel Core 2 CPU,我认为Atom330都支持这些特性,所以就使用了这个选项。
测试结果:
这是3次测试中成绩最好的一次
MEMORY INDEX : 7.444
INTEGER INDEX : 7.912
FLOATING-POINT INDEX : 7.986
结果分析:
对照PentiumIII 800MHz 3.74 3.39 6.62 的成绩
我认为内存性能和整数性能的提高是比较大的,浮点性能跟奔3相比,提高非常有限。
Atom 330的CPU是双核+超线程,所以nbench测出来的CPU那一栏是4 CPU。
我有个问题,当前linux系统的运行情况,对测试结果影响大吗?我的系统运行着默认的系统服务。
nbench能够发挥SMP(对称多处理)的性能吗?
即使nbench只能发挥单核心的性能,Atom 330主频是1.6G,又带有SSE2,SSE3,SSSE3,浮点成绩也不至于只提高这么一点啊。
atom的性能
把这些gcc选项FLAGS都研究了一边,说明你找到了学习方法,这是好现象
atom的性能很难一言蔽之,有时间的时候我再令文解析
简单的讲atom为了降低功耗是牺牲了很多性能的,在架构上将流水线数量和规模缩减,特别是双精度浮点流水线,比标准的core2减弱了多倍(但还是比cortex-a8非流水fpu强,和arm1136jf-s带的标准vfp差不多),整数性能也有相当大程度的缩小。
可以预见的是atom在整数性能上和cortex-a8/9同主频基本相仿或atom略低。浮点性能atom比cortex-a8高很多,可能和cortex-a9差不多,待确认(据ARM声称会加入流水线浮点单元)。
从近几年的趋势来看浮点性能还不是通用嵌入式CPU的重点所在,所以往往会让位于功耗和成本。atom如果和pentiumIII做到同样的同频性能,功耗与硅片面积会加大很多。不光主频影响功耗,架构也影响功耗。
另外关于SMP的问题
nbench目前主要是测试单核心的性能,打印出来的cpu信息是从/proc里面获取来,用来显示系统配置,所以原本的nbench不能直接用来测SMP。
nbench可以改造成multi-threading,能够反映多核带来的性能提升,即同时运行多个threads来实现对并发执行的支持。但是,这种bench测得的性能结果一般接近smp性能的峰值,因为缺少对实际软件中ipc和synchronous overhead的建模,所以得到的结果倾向比实际性能高。
最简单的获得结果的办法,你可以用同时启动4个nbench,得到的性能指数相加。当然同时启动很关键,否则得到的指数会更偏大。你会看到单线程的性能会有一些牺牲(因为CPU的SMT),但总和是更高的,加速应该大于2倍。
想准确一些的测试SMP性能需要另外的benchmark。此外你可以用fp_fir测试一下SSE性能,打开-ftree-vectorize
测试时,运行其他软件如果是没有负载的不会有太大影响。
问题
您好:请问最后一个fir实验中,编译选项-mfloat-abi=softfp是什么意思呢?为什么有的有,有的没有?还有编译器gcc-4.3.2是自己编译的么?GNU版还是Code Sourcery G++?谢谢!
你测试A8处理器,使用的什么平台
博主你好! 你测试Cortex-A8平台,是使用的什么测试平台?我在网上只能看到有人在卖ICETEK-OMAP3530-Mini型号的平台。
Beagleboard
测试使用的是Beagleboard和icetek-omap3530-mini
icetek-omap3530-mini是beagleboard的中国版,改动了一些芯片的型号。在电源管理、声音和USB上面有一些差异,内存和flash也有些不同
这些测试与外设关系不大,我也在icetek-omap3530-mini上面跑了这些测试
谢谢,价格倒便宜,总感觉cortex-A8以及后续的A9处
谢谢,价格倒便宜,总感觉cortex-A8以及后续的A9处理器都是向面向桌面级的了我们拿过来玩,只能玩玩THUMB2指令集和linux内核之类以前玩cortex-M3比较爽,啥都能看清,现在到A8这个级别,东西多了,把握不了
如何将写好的程序放入到模拟开发板中运行啊?
写好的程序怎样下载到模拟开发版中?
可以下载
下载方法有几种,可以通过网络或移动存储介质
网络方法需要你设置tap网卡
最简单方法,构造一个虚拟SD卡,把文件拷贝进去,再插入到板子上
构造虚拟SD卡
dd if=/dev/zero of=sdimg bs=1K count=16K
mkfs.ext2 sdimg (回答Yes)
mkdir tmpdir
mount -o loop sdimg tmpdir
cp yourfile tmpdir
umount tmpdir
即得到包含了yourfile的sdimg虚拟SD卡
下面编辑run-qemu脚本文件
加入
-sd sdimg /
这一行
运行run-qemu就可以了,在板子启动后能看到/dev/mmcblk0这个设备,当硬盘挂载
在ZIX下如何启动X Window
请问周老师,在ZIX下我想把OpenMoko的X Window界面给启动起来,应该怎么做呢?谢谢~~~~~~~~~ZIX有详细的使用文档吗?它是基于Ubuntu的衍生版吧,如果我想裁剪自己的Xubuntu,应该怎么办啊?它装出来太大,我装的是虚拟机,笔记本的性能一般,跑起来太慢了,周老师能给些这方面的网址或者资料吗?我的e-mail是richard19880121@gmail.com
启动X-window就和桌面电脑一样
启动X-window就和桌面电脑一样,在console下面进入runlevel 5就可以了
telinit 5
或者
init 5
xubuntu也不会小太多,1.6.0.1版我们出过使用xfce桌面的(和xubuntu一样)。eclipse需要j2se环境,本身比较大。
使用虚拟机应该是影响性能的最大原因,烧录成dvd会加快速度,如果内存充足基本不会有性能折扣。本身ZIX不消耗任何硬盘资源,如果需要硬盘空间存储文件,只要在硬盘上格式化一个linux友好的分区,如ext3/jfs/xjf格式,把分区的label设置成home-rw,就能够自动挂载到/home下面
我用SSH在Windows下登陆ZIX
请问zix和root用户的密码是多少啊?
无密码
密码是空的
你可以自己创建用户
我的有问题
在关闭Windows防火墙的情况下,我用root或zix经过SSH登陆ZIX,出现Enter Password对话框,按回车没用,继续出现这个对话框,除了SSH外有什么方法可以把在ZIX中写的程序取出来放到宿主Windows机器上?
打开windows网上邻居共享一个目录
ZIX里面打开了匿名FTP的,直接 ftp://zixipaddress 就可以
缺省ZIX用户的密码为空,所以无法输入密码,想用ssh服务可以先在ZIX里面运行passwd,设置一个密码,然后可以从外面ssh登录
如果希望用windows的方法,可以这样:
打开windows网上邻居共享一个目录,在ZIX里面打开位置->网络,找到你的windows邻居
多种方法选一种就可以,希望可以帮到你