我编写了一个简单的 C 代码来计算float
数组中存在的 N 的平均值。我得到每个浮点数 10.5 ClockCyles 作为大 N 的吞吐量。
arm_mean_f32()
实际上性能更差。
这不是太多的CCs/float吗?
3 操作
- 从内存加载
- 加载值的累积
- 指针增量
可以并行发生。
ARM Cortex M4F 会这样做吗?
该项目在具有 ARM Cortex M4F 的飞思卡尔 K24 处理器的定制板上运行。
我编写了一个简单的 C 代码来计算float
数组中存在的 N 的平均值。我得到每个浮点数 10.5 ClockCyles 作为大 N 的吞吐量。
arm_mean_f32()
实际上性能更差。
这不是太多的CCs/float吗?
3 操作
可以并行发生。
ARM Cortex M4F 会这样做吗?
该项目在具有 ARM Cortex M4F 的飞思卡尔 K24 处理器的定制板上运行。
ARM 实现非常传统,您可以在Github上查看,他们只是进行循环展开以减少循环开销,然后每个循环累积 4 个样本的总和,最后除以样本数,我用 M4F 尝试过,每个浮点数得到 5.3 个周期.
这是我使用的代码
#include "arm_math.h"
#define MAX_BLOCKSIZE 32
float32_t src_buf_f32[MAX_BLOCKSIZE] =
{
-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
};
float32_t result_f32;
int main(void)
{
arm_mean_f32(src_buf_f32, MAX_BLOCKSIZE, &result_f32);
return 0;
}
我认为这是使用浮点可以获得的最佳性能,性能不佳可能是由于您错误地测量了周期数或您的芯片。你也可以尝试增加编译器优化。