可以并行化ARM NEON的过滤器吗?

时间:2013-05-31 13:15:02

标签: filter arm simd neon

我试图弄清楚是否以及如何在ARM Cortex-A9 NEON SIMD设备中并行化特定的现有代码。这是代码:

for(int i=0; i < 11; i++)
{
    f4UF1 *= F[i];

    A[i][2] = A[i][1];
    A[i][1] = A[i][0];
    A[i][0] = f4UF1;

    B[i][2] = B[i][1];
    B[i][1] = B[i][0];

    C[i] = 0;

    C[i] += D[i][0] * A[i][0];
    C[i] += D[i][1] * A[i][1];
    C[i] += D[i][2] * A[i][2];

    C[i] -= E[i][1] * B[i][1];
    C[i] -= E[i][2] * B[i][2];

    B[i][0] = C[i] / E[i][0];

    f4UF1 = B[i][0];
}

我现在已经看了很多代码,我几乎可以肯定它无法有效并行化,但我想,我可以试试这里问一下。我不期待准备好的代码,只是想法如何做到这一点。谢谢:))

1 个答案:

答案 0 :(得分:1)

所以是的,这确实看起来像是每个样本的系数都会改变的双二阶,可能是因为你正在平滑它们。

作为评论者提到,您可能希望预先计算1/E[i][0]缩放因子,并可能将其转换为其他系数以减少乘法次数,尤其是在浮点平台上。您也可以经常规范化双二阶,以除去D[i][0](使其成为1.0),并将标量应用于整个输出。

当然,您可能已经意识到要在循环期间将所有内容保存在寄存器中,然后在循环完成后才将它们写入内存...; - )

之后,我知道有两种矢量化技术(虽然我也对Nils的想法感兴趣):

  1. 频道矢量化 - 最简单。如果您需要同时对多个数据集应用滤波器(例如,对于立体声音频非常常见),您可以同时使用两组音频数据操作两组系数。我发现如果使用所有SP浮点数,Neon为两个通道提供了正确数量的寄存器。瞬间2倍加速真的。
  2. 循环展开。这里详细描述有点棘手,但幸运的是这里有一个很好的页面:http://reanimator-web.appspot.com/articles/simdiir。该技术增加了极点/零点对,基本上可以同时计算更多样本。但是,额外的杆子当然会增加过滤器稳定性的额外条件,所以你必须要小心。在你的情况下,当系数似乎是动态的时,这可能是一种确保的噩梦。