对浮点值数组求和的最快方法

问题描述

我使用 Visual Studio 和 C++ 进行了 DSP 编码。

我有一个浮点数组,现在只有 8 个,但以后可能会更改为更多或更少,我需要求和为单个浮点变量,然后求平均值。

我想使用内在指令,我没有经验,为什么我在这里问。

所需要的只是代码比我下面得到的要快,而且它可以在过去 5 年内在英特尔和 AMD 处理器上运行。

注意所有数组浮点值都在-1和1之间,速度比精度更重要。

float sum = (sampleValue[0] + sampleValue[1] + sampleValue[2] + sampleValue[3] +
             sampleValue[4] + sampleValue[5] + sampleValue[6] + sampleValue[7]) / 8;

如果已经回答了这个问题,我深表歉意,如果有,请指引我找到答案,谢谢。

另外,如果有人可以指导我阅读“傻瓜的内在函数”在线文章/教程,我将不胜感激,谢谢!

解决方法

我假设您正在考虑 SIMD(单指令多数据)操作。

搜索“SIMD 内在函数”将为您提供大量资源,但这里有一个不错的入门资源:https://stackoverflow.blog/2020/07/08/improving-performance-with-simd-intrinsics-in-three-use-cases/

这篇文章也更接近您的用例: http://blog.zachbjornson.com/2019/08/11/fast-float-summation.html

,

建议使用指针

float sum = 0;
float* p = sampleValue;
for( int k = 0; k< 8; k++ )
    sum += *p++;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...