ほぼ完成したプロジェクトのプロファイリングを行ったところ、CPU 時間の約 4 分の 3 がこの IIR フィルター関数に費やされていることがわかりました (現在、ターゲット ハードウェアでは約 1 秒間に数十万回呼び出されています)。他のすべてがうまく機能しているので、特定のハードウェアとソフトウェアのターゲットに合わせて最適化できるかどうか疑問に思っています。私のターゲットは、iPhone 4 以降、iOS 4.3 以降、LLVM 4.x のみです。利益が得られる場合は、多少の不正確さはおそらく問題ありません。
static float filter(const float a, const float *b, const float c, float *d, const int e, const float x)
{
float return_value = 0;
d[0] = x;
d[1] = c * d[0] + a * d[1];
int j;
for (j = 2; j <= e; j++) {
return_value += (d[j] += a * (d[j + 1] - d[j - 1])) * b[j];
}
for (j = e + 1; j > 1; j--) {
d[j] = d[j - 1];
}
return (return_value);
}
デフォルトのコンパイラ最適化を超えて最適化することが可能であれば、あなたの意見にも興味があります。NEON SIMD が役立つものなのか (これは私にとって新しい分野です)、VFP を活用できるのか、LLVM の自動ベクトル化が役立つのか疑問に思っています。
次のLLVMフラグを試しました:
-ffast-math (顕著な違いはありませんでした)
-O4 (iPhone 4S では 25% の時間短縮で大きな違いがありましたが、最小限のターゲット デバイスである iPhone 4 では顕著な違いはありませんでした。これを改善することが私の主な目標です)
-O3 -mllvm -unroll-allow-partial -mllvm -unroll-runtime -funsafe-math-optimizations -ffast-math -mllvm -vectorize -mllvm -bb-vectorize-aligned-only (Hal Finkel のスライドからの LLVM 自動ベクトル化フラグ: http://llvm.org/devmtg/2012-04-12/Slides/Hal_Finkel.pdf、Xcode リリース ターゲットのデフォルトの LLVM 最適化よりも遅くなります)
他のフラグ、異なるアプローチ、関数への変更を受け入れます。入力と戻り値の型と値はそのままにしておくことをお勧めします。ここで実際にFIRにNEON組み込み関数を使用することについての議論があります: https://pixhawk.ethz.ch/_media/software/optimization/neon_support_in_the_arm_compiler.pdfしかし、私は情報をうまく適用するのに十分な経験がありません。自分のケースに。明確にしていただきありがとうございます。
編集これに早く気付かなかったことをお詫びします。aka.nice の提案を調査した後、e、a、および c に渡される値は常に同じ値であり、実行前にそれらを知っているため、この情報を組み込むアプローチがオプションであることに気付きました。