4

数学的な乗算と加算の計算を実行するアプリケーションにサイクルがあります。

私はいくつかの事実を知っています:

  • Android デバイスは armv6 以降のプロセッサをサポートします
  • armv6 はサポートされていません NEON コマンド

c 数学コマンドの代わりにアセンブラー数学コマンドの使用を開始した場合、armv6 を含むアプリケーションのパフォーマンスは向上しますか?

アップデート

c の代わりにアセンブラを使用するのが正しい方法です。

アップデート

私はこの計算をしています:

Ry0 = (b0a0 * buffer[index] + b1a0 * Rx1 + b2a0 * Rx2 - a1a0 * Ry1
                    - a2a0 * Ry2);

それは双二次伝達関数です。

この計算を asm で強制的に高速に実行できますか?

アップデート

  • バッファサイズは 192000 です
  • 変数はfloat型
4

4 に答える 4

12

コンパイラはその仕事に非常に優れているため、コンパイラが生成するものを知っていて、もっとうまくできることを知っていない限り、おそらくそうではありません.

コードが何をするのかを正確に知らなければ、より良い答えを出すことは不可能です。

編集: この議論を要約すると: パフォーマンスを向上させるための最初のステップは、アセンブラーを書き始めることではありません。最初のステップは、最も効率的なアルゴリズムを見つけることです。それが完了したら、アセンブラーのコーディングを見ることができます。

于 2012-12-21T20:22:50.857 に答える
8

無限インパルス応答 (IIR) 関数は、各出力要素が直前の出力要素に密接に依存するため、高性能で実装するのが困難です。これにより、出力から出力までのレイテンシが強制されます。この依存関係チェーンは、一般的な高性能技術 (SIMD、ストリップ マイニング、スーパースカラー実行など) を無効にします。

最初にアセンブリで作業することは、これに対する良いアプローチではありません。ある時点で、アセンブリでの作業が役立つ場合があります。ただし、解決すべき根本的な問題があります。前の出力を完成させ、それに係数を掛け、追加の演算結果を加算するまで、新しい出力を生成することはできません。したがって、この定式化でできる最善のことは、プロセッサが最初から最後まで乗算と加算を実行できる頻度で 1 つの出力を生成することです。他の作業を並行して実行できると仮定しても。

直前の出力ではなく、過去の他の出力や入力に依存するように IIR を書き直すことは数学的に可能です。これにより、より多くの演算が使用されますが、より多くの演算を並行して実行できる可能性が提供されるため、より高いスループットが得られます。

iPhone またはその他の iOS デバイスでは、Accelerate フレームワークで vDSP_deq22 を呼び出すだけです。Accelerate は Apple ライブラリであるため、Android では使用できません。ただし、おそらく誰かが同様のことを実装しています。

1 つのアプローチは、各出力にかかるプロセッサ サイクル数を測定することです (多くを計算し、時間を出力数で割り、プロセッサ速度で乗算します)。加算からの乗算のサイクル単位のレイテンシを (プロセッサ モデルのドキュメントから)使用しています)。かかる時間がレイテンシと同じである場合、そのプロセッサでこの演算をこれ以上高速に実行することは不可能であり、それを受け入れるか、別の演算による代替ソリューションを見つける必要があります。

于 2012-12-21T20:50:00.740 に答える
3

コンパイラの動作を確認することで、さらに速度を上げることができるかもしれませんが、これは最後に行う必要があります。まず、アルゴリズムと変数の型をよく見てください。

ターゲットは ARMv6 なので、最初に行うことは、浮動小数点演算から固定小数点演算に切り替えることです。ARMv6 は通常、ハードウェア浮動小数点をサポートしていないか、非常に低速です。通常、ARMv7 の方が優れていますが、ARM の場合、固定小数点演算は通常、浮動小数点の実装よりもはるかに高速です。

于 2012-12-21T21:26:04.467 に答える