在Cortex-A8平台下memcpy ARM/NEON汇编性能的测试
表是运行环境的统计。
硬件平台
软件环境
imx51 800MHZ
openembedded-gpe
imx53 1000MHZ
openembedded-gpe
imx53 800MHZ
openembedded-gpe
msm7230 1000MHZ
Android + chroot
msm7230 800MHZ
Android + chroot
msm8250 1000MHZ
Android + chroot
omap3430 550MHZ
openembedded-gpe
omap3730 1000MHZ
openembedded-gpe
s5pc100 665MHZ
Android + chroot
s5pc110 1000MHZ
Android + chroot
下表是测试项目的统计。
实现方案
i.MX51
i.MX53
Snapdragon
s5pc1xx
omap3430
omap3730
int32_cpy
YES
YES
YES
YES
YES
YES
vec_cpy
YES
YES
YES
YES
YES
YES
arm9_memcpy
YES
YES
YES
YES
YES
YES
armv5te_memcpy
YES
YES
YES
YES
YES
YES
memcpy_arm
YES
YES
YES
YES
YES
YES
memcpy_arm_nopld
YES
NO
YES
YES
YES
YES
memcpy_neon
YES
YES
YES
YES
YES
YES
memcpy_neon_nopld
YES
NO
YES
YES
YES
YES
memcpy_armneon
YES
YES
YES
YES
YES
YES
memcpy_ple_arm
YES
YES
N/A
YES
N/A
YES
memcpy_ple_neon
YES
YES
N/A
YES
N/A
YES
memcpy_arm_codesourcery
YES
YES
YES
YES
YES
YES
memcpy_arm_codesourcery_nopld
YES
NO
YES
YES
YES
YES
memcpy_neon_codesourcery
YES
YES
YES
YES
YES
YES
memcpy_neon_codesourcery_nopld
YES
NO
YES
YES
YES
YES
memcpy_neon_qualcomm
YES
YES
YES
YES
YES
YES
memcpy_neon_qualcomm_nopld
YES
NO
YES
YES
YES
YES
memcpy_neon_siarhei
YES
YES
YES
YES
YES
YES
注1:因为i.MX53 EVK板子发生故障,未能测试所有no pld的测试项。
注2:在给omap3430打开preload engine后,测试产生非法指令错,未能测试ple的测试项。
注3:要替换Snapdragon kernel有些麻烦,未能测试ple的测试项。
测试结果与分析
下面的图表限于页面大小不能很好地显示细节。具体的数据和大图可到数据表文档中查看。
各个硬件平台上各种实现的表现
imx51 800MHZ
imx53 1000MHZ
imx53 800MHZ
msm7230 1000MHZ
msm7230 800MHZ
msm8250 1000MHZ
omap3430 550MHZ
omap3730 1000MHZ
s5pc100 665MHZ
s5pc110 1000MHZ
小结
- 在block size = 512B ~ 32K之间,有一个性能高台,block size = 256K也有一个性能的转折。
- 这个特性体现了32KB L1 / 256KB L2 cache的影响。
- 小于512B的性能不佳,可能与函数调用,函数开始的块对齐技巧造成的损耗有关,也可能与block size太小,cache没有准备好函数就结束了有关。
- 文档[]对memcpy的实现还是有指导意义的。但随着芯片内部的优化和工艺的提升,有些规则发生了变化。
- NEON指令的性能总是要高于ARM指令的性能。但交替使用ARM/NEON指令并不总是带来性能的提升。随着发展ARM/NEON指令之间性能差在缩小。
- pld指令的作用越来越小。在较老的芯片上,如omap3430,采用pld指令后,同一个实现可以有50%的性能提升。在较新的芯片上,如msm7230/s5pc110上,性能基本没有区别,甚至同一个实现没有pld指令后,性能稍稍有些提升。这也许是因为pld指令没有效果,倒反在每个循环中浪费了时钟周期造成的。
- 采用ple指令的实现的性能令人大失所望。这也说明如果没有很好的模型设计,软件去干预cache的使用,很容易会造成性能的恶化。
- Snapdragon平台有最好的cache性能。超出cache后,各种实现(包括C语言实现)的性能基本一致,也很高效。这也许是Snapdragon平台13-stage load/store pipeline[][]的设计造成的。这个特性对高级语言是有好处的。因为编程不可能在很多地方采用汇编语言。这样开发人员就不必过多地考虑汇编优化,依赖编译器就可以了。
- s5pc110平台有最好的平均性能。超出cache后,NEON实现的性能最好,基本保持一条水平线。
在small/big block size下各个硬件平台的表现
性能因为block size分为fit in cache / out of cache两种表现,所以做两个剖面做对比分析。
- 8K block size。体现fit in cache时的性能。
- 8M block size。体现out of cache时的性能。
M?ns Rullg?rd的实现
因为M?ns Rullg?rd的实现最简单,除了一个循环体外,没有其它判断代码,可以认为是体现平台速度极限的实现。
ARM的实现
NEON的实现
小结
- NEON指令的性能总是要高于ARM指令的性能。随着发展ARM/NEON指令之间性能差在缩小。
- 交替使用ARM/NEON指令,在fit in cache条件下性能要差于NEON版本。在out of cache条件下,两个版本性能基本一样。
- 在fit in cache条件下,Snapdragon平台有最好的性能。超过第二名s5pc110大约为43%。
- 在out of cache条件下,s5pc110有最好的性能。超过第二名omap3730大约为57%。
- 在同一个硬件平台下,超频(如i.MX53 800/1000MHZ & msm7x30 800/1000MHZ)对memory性能影响很小。
实用ARM/NEON实现在各个硬件平台的表现
通过同一种实现在不同硬件平台上性能的对比,结合上一节的图表,可
Cortex-A8平台memcpyARMNEON汇编性 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)