微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 在Cortex-A8平台下memcpy ARM/NEON汇编性能的测试

在Cortex-A8平台下memcpy ARM/NEON汇编性能的测试

时间:11-10 来源:互联网 点击:
本文介绍了基于ARMv7架构的Cortex-A8芯片(FreeScale i.MX51 / i.MX53/QualComm msm8x50 / msm7x30/Samsung s5pc100 / s5pc110/TI omap 3430 / omap 3730芯片)上采用C语言、ARM汇编和NEON汇编实现的memcpy的性能对比,并输入分析了NEON指令(不同处理器的NEON内存位宽从64-bit到128-bit不等)和cache的预取preload(preload engine指令)对性能的影响。最终结论表明1.在拷贝块大小block size = 512B ~ 32K之间,有一个性能高台,block size = 256K也有一个性能的转折。这个特性体现了芯片32KB L1 / 256KB L2 cache的影响;2. NEON指令的性能总是要高于ARM指令的性能。随着发展ARM/NEON指令之间性能差在缩小。交替使用ARM/NEON指令,性能往往要差于NEON版本;3.如果没有很好的模型设计,软件去干预cache的使用,很容易会造成性能的恶化; 4.在fit in cache条件下,Snapdragon平台有最好的性能; 5.在out of cache条件下,s5pc110有最好的性能; 6.在同一个硬件平台下,超频对memory性能影响很小; 7.同一种的实现,在不同的硬件平台上都有不同的表现。没有一种实现在所有平台上是最好的。
  1. 前言

    在C run time library中,memcpy是重要的函数,对应用软件的性能有着重要的影响。ARM芯片发展到Cortex-A8[1][2]架构,不但频率有了很大提升,而且架构设计有了很大地改进。其中增加的NEON指令,是类似于原先X86平台下的MMX指令,是为多媒体而设计。但因为这类指令一次可以处理64-bit数据,对memcpy函数性能提升也很有帮助。本文主要是测试采用NEON[2]指令的多种memcpy实现,探讨NEON指令和预取(preload)指令对性能的影响,以及在芯片优化和工艺进步后,这些影响的变化趋势。同时希望芯片设计人员在了解软件实现的基础上,给予一个知其然,也知其所以然的解释,进而指导进一步提高性能的方向。

  2. 平台介绍

    本次的测试平台来源于笔者工作项目中接触到的Cortex-A8平台。见下面列表:

  • FreeScale i.MX51 / i.MX53
  • QualComm msm8x50 / msm7x30
  • Samsung s5pc100 / s5pc110
  • TI omap 3430 / omap 3730
  1. 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
  1. 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
  1. 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
  1. 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
  1. memcpy实现介绍

    memcpy的实现在ARM平台上的发展有3类版本:

  2. C语言版本
  3. ARM汇编版本
  4. 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。所以汇编版本中

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top