ARM Cortex-A9 NEON性能初步测试

最近在ZC702上对ARM Cortex-A9的NEON性能做了些测试。

测试代码如下:

        .balign  4
        .global neon_best_pipelne
        .arm
neon_best_pipelne:
        .rept 10000
        vmla.f32 q10, q0, q5
        vmla.f32 q11, q1, q6
        vmla.f32 q12, q2, q7
        vmla.f32 q13, q3, q8
        vmla.f32 q14, q4, q9
        .endr
        BX lr
时间用Private Timer来度量,Private Timer的clock为CPU clock的一半,可以很精确的统计算法使用的时间。

VLD和VST访问的数据最好是8字节对齐:DATATYPE vec1[SIZE] __attribute__((aligned(8)));


FLOAT的测试结果如下:

Nr of valid NEON instructions PCLK(Filtered Average) CPU_CLK per instruction
5 50040.12
~2
4 45017.75 ~2.25
3 45025.00 ~3
2 44999.00 ~4.5
1 44974.75 ~9
   注意:

   1. Nr of valid NEON instructions: 从下往上注释掉不用的VMLA指令
   2. Filtered Average的算法: (total-max-min)/(LOOP-2)

按照MPE的文档,VMLA Qd,Qn,Qm在没有pipeline interlock的情况下,最小需要的cycle为2。但是实际测试发现这个需要在VMLA指令连续的情况下才能达到。

NEON上FLOAT的极限性能:

根据MPE手册,VMLA Qd,Qn,Qm在没有pipeline interlock的情况下,最小需要的cycle为2。也就意味着理想情况下每个CPU cycle能完成2次float乘加运算,这样1GHz的单核CA9可以提供2GFLOPS。但是实际上往往其他指令(VLD,VST,etc)会把性能降下来


VMLA的指令后缀改成.i32,即可测试int 32在NEON上的性能。int32的性能数据和MPE手册吻合的比较好。

Nr of valid NEON instructions PCLK(Filtered Average) CPU_CLK per instruction
5 100012.25
~4
4 80005.50 ~4
3 60017.50 ~4
2 40018.25 ~4
1 25009.88 ~5

你可能感兴趣的:(ARM Cortex-A9 NEON性能初步测试)