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...

posted @ 2021-09-08 22:44  Yanye  阅读(408)  评论(0编辑  收藏  举报