【发布时间】:2013-05-31 13:15:01
【问题描述】:
我试图弄清楚是否以及如何并行化特定的现有代码以用于 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];
}
我已经看了相当多的代码,我几乎可以肯定它不能被有效地并行化,但我想,我可以试试看这里。我不期待准备好的代码,只是关于如何做的想法。谢谢:)
【问题讨论】:
-
有哪些数据类型?你应该粘贴一些可以满足编译器的东西。
-
编译它并检查输出可能会提供一些见解。
-
您可以使用 vext 指令向下滑动元素。您也可以进行乘法/加法。如果你用 NEON 写的话,看起来你可以改进几个周期。唯一的问题是需要将除法转换为乘法。
-
这是一个标准的双二阶过滤器,对吧?好吧 - 如果您可以接受一些全局输出延迟,则可以使用技巧来并行化它。
-
@NilsPipenbrinck:+1 用于识别它是 Biquad;不过,如果有一些关于您提到的优化机会的指针,那就太好了。