考虑以下代码,其中a
是float
的参数数组,s
是float< 的初始未初始化结果数组
:
s[n - 1] = mu * a[n - 1];
for (int j = n - 2; j >= 0; j--)
s[j] = mu * (a[j] + s[j + 1]);
return s;
是否有机会使用 SIMD (AVX2) 提高此类循环代码的性能?
编辑:后来我发现这个公式/算法被称为“折扣和”,但在互联网上找不到它的平行版本。
最佳答案
相关:Is it possible to use SIMD on a serial dependency in a calculation, like an exponential moving average filter? - 如果前面有 n 步的封闭形式公式,您可以使用它来回避串行依赖性。但我不认为这里是这种情况。
这看起来像一个前缀和类型的串行依赖,在垂直添加之上,带有 a[j]
。有一些方法可以加速,比如
O( SIMD_width/log(SIMD_width) )
。
关于c++ - 是否有机会使用 SIMD 加速循环代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54664368/