3

プライマリサンプルデータ型として32ビットフロートを使用する一連のc++信号処理クラスがあります。たとえば、すべてのオシレータークラスは、要求されたすべてのサンプルに対してフロートを返します。これはすべてのクラスで同じであり、サンプルのすべての計算は浮動小数点で行われます。

私はこれらのクラスをiOSに移植しています。パフォーマンスの問題については、プロセッサを最大限に活用するために8.24固定小数点で操作したいのですが、iOSでは、浮動小数点数ではなく整数をクランチすることでパフォーマンスが大幅に向上します。 mは現在、すべての計算をfloatで実行しており、出力前に最終段階でSInt32に変換します。つまり、最終段階のすべてのサンプルを変換する必要があります。

クラス内で使用されるデータ型をFloatからSInt32に変更するだけですか。だから私のオシレーターやフィルターなどは、フロートの代わりにSInt32を内部的に渡すことによって固定小数点で計算しますか?

本当にこんなに簡単なの?または、すべての異なるアルゴリズムを完全に書き直す必要がありますか?

この使命を引き受ける前に理解する必要のある他のブードゥーはありますか?

これについてコメントする時間を見つけてくれた人に感謝します。

4

1 に答える 1

2

それは主に神話です。サムモードでコンパイルした場合、浮動小数点のパフォーマンスは遅くなりましarmv6た。これarmv7はThumb2をサポートする問題ではありません(Xcodeでサポートされなくなったarmv6についてのこれ以上の説明は避けます)。また、フロートはより高速なNEON(別名Advanced SIMD Instructions)ユニットを使用できるため、doubleの使用は避けたいと思います。これは誤って行うのが簡単です。有効にしてみてください-Wshorten

また、8.24乗算を実行すると、特にNEONユニットを使用するよりも、パフォーマンスが大幅に向上するかどうかも疑問です。float int//を変更してもint32_tSInt328.24乗算に必要なシフトは自動的に実行されません。

floatをintに変換するのが遅いことがわかっている場合は、Accelerate.frameworkのいくつかの関数、つまりvDSP_vfix16()またはvDSP_vfixr16()の使用を検討してください。

于 2013-01-14T23:38:55.773 に答える