c++ - 是否有机会使用 SIMD 加速循环代码?

标签 c++ performance vectorization simd avx2

考虑以下代码,其中afloat 的参数数组,sfloat< 的初始未初始化结果数组:

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/

相关文章:

performance - 有什么办法可以避免这些嵌套循环吗?

performance - 如何在 Functional Automation Suite 运行时测量浏览器上的应用程序性能?

c++ - Cuda Thrust内存管理

c++ - 按列主顺序迭代行主存储数组

objective-c - 私有(private)成员是否增加任何性能优势?

r - 当数据在列表中时,我可以向量化代码吗?

python - 使用多个 if-else 子句对 pandas 数据框进行矢量化以分割域

c++ - 使用 GCC 洗牌巨大位 vector 的最有效方法是什么

c++ - 通过指针获取最大元素个数

c++ - 是否有适用于迭代器的数字解析函数?