最近在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 |