浮点值数组求和的最快方法 我用Visual Studio和C++做了DSP编码。

浮点值数组求和的最快方法 我用Visual Studio和C++做了DSP编码。,c++,visual-studio,intel,intrinsics,amd-processor,C++,Visual Studio,Intel,Intrinsics,Amd Processor,我有一个浮点数组,现在只有8个,但以后可能会变为更多或更少,我需要求和到一个浮点变量,然后求平均值 我想使用内在的指示,我没有经验,为什么我在这里问 所有需要的是,代码比我下面得到的要快,而且它将在英特尔和AMD处理器上工作,比如说在过去5年内 请注意,所有数组浮点值都在-1和1之间,速度比精度更重要 float sum = (sampleValue[0] + sampleValue[1] + sampleValue[2] + sampleValue[3] + samp

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

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

所有需要的是,代码比我下面得到的要快,而且它将在英特尔和AMD处理器上工作,比如说在过去5年内

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

float sum = (sampleValue[0] + sampleValue[1] + sampleValue[2] + sampleValue[3] +
             sampleValue[4] + sampleValue[5] + sampleValue[6] + sampleValue[7]) / 8;
我很抱歉,如果这个问题已经得到了回答,如果是的话,请告诉我答案,谢谢


另外,如果有人能告诉我有关虚拟人的内在功能的在线文章/教程,我将不胜感激,谢谢

建议使用指针

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

我假设您考虑的是SIMD单指令多数据操作

搜索SIMD Intrinsic将为您提供大量资源,但这里有一个很好的开端:

本文也更接近您的用例:

我会使用。它可能是使用CPU中可用的快速指令以一种有效的方式实现的。虽然std::acculate是可用的,但std::reduce在我的编译器中似乎不可用。我不太清楚如何使用它。@ravenpoint这是次优的,因为它包含两个间接层次。将数据存储在单个std::vector中并计算适当的偏移量应该更快,因为它对缓存更友好。@DKDiveDude:std::accumulate可用于任何迭代器对,指针也是迭代器。不需要从float[]更改。@pptaszni:您通常希望使用0.0f,而不是0.0,因此累积类型是float not double,而不是强制编译器动态地将float转换为double。但要让编译器从addps开始矢量化,以减少8到4个元素,您需要一个快速数学选项,或者为此特定循环授予它权限。感谢您的加入,但是没有一个可以对整个数组求和的内在向量类型函数吗,任何这样的函数都可能会使用这段代码,但会带来函数调用的开销——可能是编译器优化掉的。在执行此操作的循环中测试并计算高分辨率刻度。我自己的简单版本快了9%。