平均N个浮动样本的ARM CMSIS DSP吞吐量

平均N个浮动样本的ARM CMSIS DSP吞吐量,arm,signal-processing,cmsis,Arm,Signal Processing,Cmsis,我编写了一个简单的C代码来计算数组中存在的Nfloats的平均值。我得到了10.5个时钟周期每个浮点数作为大N的吞吐量 arm\u mean\u f32()实际上性能较差 这不是太多CCs/浮子吗 三个行动 从内存加载 加载值的累积 指针增量 可以同时发生 ARM Cortex M4F会这样做吗 该项目是在带有ARM Cortex M4F的飞思卡尔K24处理器的定制板上运行的。ARM实现非常传统,您可以检查它,他们只需进行循环展开以减少循环开销,然后累积每个循环4个样本的总和,最后划分样本数,我

我编写了一个简单的C代码来计算数组中存在的N
float
s的平均值。我得到了10.5个时钟周期每个浮点数作为大N的吞吐量

arm\u mean\u f32()
实际上性能较差

这不是太多CCs/浮子吗

三个行动

  • 从内存加载
  • 加载值的累积
  • 指针增量
  • 可以同时发生

    ARM Cortex M4F会这样做吗


    该项目是在带有ARM Cortex M4F的飞思卡尔K24处理器的定制板上运行的。

    ARM实现非常传统,您可以检查它,他们只需进行循环展开以减少循环开销,然后累积每个循环4个样本的总和,最后划分样本数,我用M4F试过了,每个浮子有5.3个循环

    这是我使用的代码

    #包括“arm_math.h”
    #定义最大块大小32
    浮动32_t src_buf_f32[最大块大小]=
    {
    -0.4325648115282207,  -1.6655843782380970,  0.1253323064748307,
    0.2876764203585489,  -1.1464713506814637,  1.1909154656429988,
    1.1891642016521031,  -0.0376332765933176,  0.3272923614086541,
    0.1746391428209245,  -0.1867085776814394,  0.7257905482933027,
    -0.5883165430141887,   2.1831858181971011, -0.1363958830865957,
    0.1139313135208096,   1.0667682113591888,  0.0592814605236053,
    -0.0956484054836690,  -0.8323494636500225,  0.2944108163926404,
    -1.3361818579378040,   0.7143245518189522,  1.6235620644462707,
    -0.6917757017022868,   0.8579966728282626,  1.2540014216025324,
    -1.5937295764474768,  -1.4409644319010200,  0.5711476236581780,
    -0.3998855777153632,   0.6899973754643451
    };
    浮动32_t结果_f32;
    内部主(空)
    {
    arm平均值f32(src buf f32、最大块大小和结果f32);
    返回0;
    }
    

    我认为这是使用浮点运算可以获得的最佳性能,您的性能不佳可能是因为您测量的周期数不正确或您的硅。您还可以尝试增加编译器优化。

    ARM实现是非常传统的,您可以检查它,它们只需执行循环展开以减少循环开销,然后累积每个循环4个样本的总和,最后除以样本数,我使用M4F进行了尝试,每个浮点得到了5.3个循环

    这是我使用的代码

    #包括“arm_math.h”
    #定义最大块大小32
    浮动32_t src_buf_f32[最大块大小]=
    {
    -0.4325648115282207,  -1.6655843782380970,  0.1253323064748307,
    0.2876764203585489,  -1.1464713506814637,  1.1909154656429988,
    1.1891642016521031,  -0.0376332765933176,  0.3272923614086541,
    0.1746391428209245,  -0.1867085776814394,  0.7257905482933027,
    -0.5883165430141887,   2.1831858181971011, -0.1363958830865957,
    0.1139313135208096,   1.0667682113591888,  0.0592814605236053,
    -0.0956484054836690,  -0.8323494636500225,  0.2944108163926404,
    -1.3361818579378040,   0.7143245518189522,  1.6235620644462707,
    -0.6917757017022868,   0.8579966728282626,  1.2540014216025324,
    -1.5937295764474768,  -1.4409644319010200,  0.5711476236581780,
    -0.3998855777153632,   0.6899973754643451
    };
    浮动32_t结果_f32;
    内部主(空)
    {
    arm平均值f32(src buf f32、最大块大小和结果f32);
    返回0;
    }
    

    我认为这是使用浮点运算可以获得的最佳性能,您的性能不佳可能是因为您测量的周期数不正确或您的硅。您还可以尝试增加编译器优化。

    我想浮点除法需要很多时间。尝试计算倒数并将其与和相乘,应该可以节省一些时间。我猜浮点除法需要很多时间。尝试每次计算倒数并将其与总和相乘,应该可以节省一些时间。