在Cortex-A8平台下memcpy ARM/NEON汇编性能的测试
前言
在C run time library中,memcpy是重要的函数,对应用软件的性能有着重要的影响。ARM芯片发展到Cortex-A8[1][2]架构,不但频率有了很大提升,而且架构设计有了很大地改进。其中增加的NEON指令,是类似于原先X86平台下的MMX指令,是为多媒体而设计。但因为这类指令一次可以处理64-bit数据,对memcpy函数性能提升也很有帮助。本文主要是测试采用NEON[2]指令的多种memcpy实现,探讨NEON指令和预取(preload)指令对性能的影响,以及在芯片优化和工艺进步后,这些影响的变化趋势。同时希望芯片设计人员在了解软件实现的基础上,给予一个知其然,也知其所以然的解释,进而指导进一步提高性能的方向。
平台介绍
本次的测试平台来源于笔者工作项目中接触到的Cortex-A8平台。见下面列表:
- FreeScale i.MX51 / i.MX53
- QualComm msm8x50 / msm7x30
- Samsung s5pc100 / s5pc110
- TI omap 3430 / omap 3730
i.MX5 family
i.MX5 family的介绍见[6][7]。其中i.MX535可以运行在800MHZ / 1000MHZ两种频率上。
i.MX515
- freq: 800MHZ
- cache size: 32KB/32KB I/D Cache and 256KB L2 Cache
- cache line: 64-bit wide(NEON), 64-byte / line
- i.MX535
- freq: 800MHZ / 1000MHZ
- cache size: 32KB/32KB I/D Cache and 256KB L2 Cache
- cache line: 64-bit wide(NEON), 64-byte / line
Snapdragon family
Snapdragon的介绍见[8][9][10]。其中msm7x30可以运行在800MHZ / 1000MHZ两种频率上。此外Snapdragon cache特别之处是128-bit wide(NEON), 128-byte / line。标准Cortex-A8中,该数值为64-bit wide(NEON), 64-byte / line。这对性能有较大影响。
msm8x50
- freq: 1000MHZ
- cache size: 32KB/32KB I/D Cache and 256KB L2 Cache
- cache line: 128-bit wide(NEON), 128-byte / line
msm7x30
- freq: 800MHZ / 1000MHZ
- cache size: 32KB/32KB I/D Cache and 256KB L2 Cache
- cache line: 128-bit wide(NEON), 128-byte / line
s5pc family
s5pc family参考平台见[11]。
s5pc100
- freq: 665MHZ
- cache size: 32KB/32KB I/D Cache and 256KB L2 Cache
- cache line: 64-bit wide(NEON), 64-byte / line
s5pc110
- freq: 1000MHZ
- cache size: 32KB/32KB I/D Cache and 512KB L2 Cache
- cache line: 64-bit wide(NEON), 64-byte / line
omap3 family
omap3 family参考平台见[12][13][14]。
omap3430
- freq: 550MHZ
- cache size: 16KB/16KB I/D Cache and 256KB L2 Cache
- cache line: 64-bit wide(NEON), 64-byte / line
omap3730
- freq: 1000MHZ
- cache size: 32KB/32KB I/D Cache and 256KB L2 Cache
- cache line: 64-bit wide(NEON), 64-byte / line
memcpy实现介绍
memcpy的实现在ARM平台上的发展有3类版本:
- C语言版本
- ARM汇编版本
NEON汇编版本
ARM公司的文档[4]对memcpy的实现有很好描述。有人[5][19][20]还进一步阐述了实现原理和技巧。简述如下:
- NEON指令一次可以处理64-bit数据,效率更高。
- NEON架构与L1/L2 cache都有直连,在OS层级enable后,可以获得更好的性能。
- ARM / NEON的pipeline有可能异步处理,交替使用ARM / NEON指令有可能获得更好的性能。
- 在一次循环中,用尽可能多的寄存器copy更多的数据,保证pipeline有更好的效率。目前一次最大处理块为128-byte。
对cache的操作有讲究。
- memcpy属于一次扫瞄无回溯的操作,对于cache采用预取(preload)策略可以提高hit rate。所以汇编版本中
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)