1

多くの浮動小数点演算と三角関数を使用する ARM ターゲットのコードを書いています。私の知る限り、浮動小数点の計算は int よりもはるかに遅いです (特に ARM では)。精度は重要ではありません。

倍率 (0*pi から 2*pi の範囲の pe は int 0 から 1024 になります) とルックアップ テーブルを使用して、独自の三角関数を実装することを考えました。それは良いアプローチですか?代替手段はありますか?

ターゲット プラットフォームは、ubuntu を実行する Odroid U2 (Exynos4412) と他の多くのもの (Web サーバーなど) です。

(c++11 およびブースト/ライブラリが許可されます)

4

4 に答える 4

5

ターゲット プラットフォームに数学ライブラリがある場合は、それを使用します。もしよければ、速度を考えていた専門家によって書かれました。何が速いか遅いかについての推測に基づいてコードを設計するべきではありません。実際の測定値やプロセッサの仕様がなく、アプリケーションの三角関数が多くの時間を消費していることがわからない場合は、数学ライブラリを置き換える正当な理由はありません。

通常、浮動小数点命令は整数命令よりもレイテンシが長くなりますが、スループットが同等になるようにパイプライン処理されます。(たとえば、浮動小数点ユニットは作業を行うために 4 つのステージを持っている場合があるため、命令はすべてのステージを処理するのに 4 サイクルかかりますが、新しい命令を各サイクルの最初のステージにプッシュすることができます。)整数実装と同等のパフォーマンスを提供するのに十分なパフォーマンスは、ターゲットプロセッサ、使用されているアルゴリズム、および実装者のスキルに大きく依存します。

数学ルーチンのカスタム実装を使用することが有益である場合、その設計方法は状況に大きく依存します。適切なアドバイスは、サポートするドメインによって異なります (ちょうど 0 から 2π? –2π から +2π? おそらくより大きな値で、-π から π に折りたたむ必要がありますか?)、どのような特殊なケースをサポートする必要があるか (NaN を伝搬しますか?)、必要な精度、プロセッサで他に何が起こっているか (大量のメモリが使用されているか、またはキャッシュに残っているルックアップ テーブルに頼ることができるか) など。

三角関数ルーチンの重要な部分は、さまざまなケース (NaN、無限大、小さい値) を処理し、2π を法として引数を削減することです。特殊なケースを処理しない、または引数の削減を実行しないが、浮動小数点を使用する簡素化されたルーチンを実装できる場合があります。

于 2013-07-31T16:00:46.030 に答える
1

考えられる代替手段の 1 つは trigint です。

  1. トライギントのダウンロード
  2. トリギント・ドキシゲン
于 2013-07-31T15:50:03.270 に答える