AM335X NEON和VFPV3的性能测试
简介
AM3352 CortexA8 单核1GHz,对比开启NEON+VFP与使用软浮点数(-mfloat-abi=soft)进行计算的差异。
开启NEON+VFP的编译参数
启动文件中需要开启NEON协处理器
@
@ Enable Neon/VFP Co-Processor
@
MRC p15, #0, r1, c1, c0, #2 @ r1 = Access Control Register
ORR r1, r1, #(0xf << 20) @ enable full access for p10,11
MCR p15, #0, r1, c1, c0, #2 @ Access Control Register = r1
MOV r1, #0
MCR p15, #0, r1, c7, c5, #4 @flush prefetch buffer
MOV r0,#0x40000000
FMXR FPEXC, r0 @ Set Neon/VFP Enable bit
编译参数:
-march=armv7-a -mtune=cortex-a8 -ftree-vectorize -ffast-math -mfpu=neon-vfpv3 -mfloat-abi=hard
使用软浮点数的编译参数
启动文件中去除启动NEON协处理器的代码,因为arm32指令集里没有FMXR
,这样才能顺利编译通过
编译参数:
-march=armv7-a -mtune=cortex-a8 -mfloat-abi=soft
单测VFP与软浮点数
矩阵线性缩放 y=kx+b
单精度浮点数,测试10W次
测试代码:
static void _VectorFloatScale(float *vectorA, float *vectorB, float *result)
{
unsigned int index = 0u;
for(index = 0; index < VECTOR_SIZE; index++)
{
result[index] = (vectorA[index] * CONST_PI_VAL) + vectorB[index];
}
}
测试结果:
类型 | 开启VFP | 软浮点 |
---|---|---|
2590 ms | 6876 ms |
矩阵相乘
单精度浮点数,测试10W次
测试代码:
static void _VectorFloatMultiply(float *vectorA, float *vectorB, float *result)
{
unsigned int index = 0u;
for(index = 0; index < VECTOR_SIZE; index++)
{
result[index] = vectorA[index] * vectorB[index];
}
}
测试结果:
类型 | 开启VFP | 软浮点 |
---|---|---|
1204 ms | 2158 ms |
单测NEON+VFP与软浮点数
// TODO...
单测NEON+VFP与仅使用VFP
// TODO...