【发布时间】:2013-04-05 09:08:24
【问题描述】:
以下是IIR code。我需要对代码进行矢量化处理,以便高效地编写 NEON 代码。
矢量化示例 非矢量化代码
for(i=0;i<100;i++)
a[i] =a[i]*b[i]; //only one independent multiplication cannot take
//advantage of multiple multiplication units
矢量化代码
for(i=0;i<25;i++)
{
a[i*4] =a[i*4]*b[i*4]; //four independent multiplications can use
a[(i+1)*4] =a[(i+1)*4]*b[(i+1)*4]; // multiple multiplication units to perform the
a[(i+2)*4] =a[(i+2)*4]*b[(i+2)*4]; //operation in parallel
a[(i+3)*4] =a[(i+3)*4]*b[(i+3)*4];
}
请帮助我将下面的for循环向量化,以便利用硬件的向量能力有效地实现代码(我的硬件可以同时执行4次乘法)。
main()
{
for(j=0;j<NUMBQUAD;j++)
{
for(i=2;i<SAMPLES+2 ;i++)
{
w[i] = x[i-2] + a1[j]* w[i-1] + a2[j]*w[i-2];
y[i-2] = w[i] + b1[j]* w[i-1] + b2[j]*w[i-2];
}
w[0]=0;
w[1] =0;
}
}
【问题讨论】:
-
首先让它工作。我可能弄错了,但通常 IIR 访问前馈循环中的多个元素。这仅访问 x[i-2]。
-
@Aki 所说的 - 尝试优化损坏的代码是没有意义的。对于 IIR 过滤器,您有问题的依赖关系 - 实际上,与 4 路 SIMD 并行实现 4 个单独的 IIR 过滤器比尝试将 SIMD 应用于单个 IIR 过滤器更容易。
-
这是双二阶 IIR 的另一种形式,方程采用 en.wikipedia.org/wiki/Digital_biquad_filter#Direct_Form_2
-
@PaulR 这是大多数人在我看到的各种代码中所做的。有没有办法至少部分改进代码?
标签: optimization parallel-processing arm vectorization neon