我试图弄清楚是否以及如何在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];
}
我现在已经看了很多代码,我几乎可以肯定它无法有效并行化,但我想,我可以试试这里问一下。我不期待准备好的代码,只是想法如何做到这一点。谢谢:))
答案 0 :(得分:1)
所以是的,这确实看起来像是每个样本的系数都会改变的双二阶,可能是因为你正在平滑它们。
作为评论者提到,您可能希望预先计算1/E[i][0]
缩放因子,并可能将其转换为其他系数以减少乘法次数,尤其是在浮点平台上。您也可以经常规范化双二阶,以除去D[i][0]
(使其成为1.0
),并将标量应用于整个输出。
当然,您可能已经意识到要在循环期间将所有内容保存在寄存器中,然后在循环完成后才将它们写入内存...; - )
之后,我知道有两种矢量化技术(虽然我也对Nils的想法感兴趣):