3

タイムクリティカルな動作期間中にsin/cos計算を実行するリアルタイムシステムを開発しています。パフォーマンスを向上させるためにルックアップテーブルを使用することを検討しており、テーブルを実装することのメリット/コストをベンチマークしようとしています。残念ながら、どの程度の精度が必要になるかはまだわかりませんが、おそらく小数点以下5〜6桁です。

C ++の三角関数とルックアップアプローチの比較は、すでに行われていると思います。私は誰かがそのようなベンチマークを文書化したサイトへのリンクを私に提供してくれることを望んでいました。そのような結果が存在しない場合は、特定の最小精度を想定してルックアップテーブルに必要なメモリ量を決定する方法、および潜在的な速度の利点を決定する方法についての提案をいただければ幸いです。

ありがとう!

4

3 に答える 3

2

すべての質問にお答えすることはできませんが、理論上の速度の利点を判断しようとする代わりに、実際のアプリケーションでプロファイルを作成する方がほぼ確実です。次に、特定の問題領域でどのような改善が必要かを正確に把握できます。これは、ニーズに最も役立つ情報です。

于 2010-09-15T20:41:56.000 に答える
1

度の入力の精度はどれくらいですか(議論を「より単純」に保つために、ラジアンよりも度を使用しましょう)。10分の1度?100分の1度?角度の精度が高くない場合、トリガーの結果はこれ以上良くなることはありません。

私はこれが100分の1度でインデックス付けされた配列として実装されているのを見てきました(角度を2つの暗黙の小数点付きの整数として維持することも計算に役立ちます-高精度の浮動小数点数/ダブルラジアン角度を使用する必要はありません)。

0.00〜90.00度の保存SIN値は、900132ビットフロート結果値になります。

SIN [0] = 0.0 ... SIN [4500] = 0.7071068 ... SIN [9000] = 1.0

SINがある場合、COS(a)= SIN(90-a)のtrigプロパティは、COS(a)を取得するためにSIN[9000-a]を実行することを意味します。

より高い精度が必要であるが、より多くのテーブルスペース用のメモリがない場合は、配列内の2つのエントリ間で線形補間を行うことができます。たとえば、SINが45.00123の場合は次のようになります。

SIN [4500] + 0.123 *(SIN [4501]-SIN [4500])

于 2010-09-16T01:09:21.987 に答える
0

2 つのアプローチのパフォーマンス特性を知る唯一の方法は、実際に試してみることです。

はい、おそらく他の人が作成したベンチマークがありますが、それらはあなたのコードのコンテキストでは実行されず、ハードウェアでも実行されていないため、状況にはあまり当てはまりません.

ただし、できることの 1 つは、CPU のマニュアルで命令のレイテンシを調べることです。(Intel と AMD は、この情報を Web サイトで PDF 形式で入手できます。また、他のほとんどの CPU メーカーにも同様のドキュメントがあります)

そうすれば、少なくとも実際のトリガー命令がどれだけ速いかを知ることができ、価値があるためにルックアップ テーブルが勝たなければならないベースラインが得られます。

しかし、それは方程式の一方の側の概算を与えるだけです。CPU のキャッシュの待機時間を知っていて、メモリ アクセスの待機時間を大まかに把握している場合は、ルックアップ テーブルのコストも同様に大まかに見積もることができます。

しかし、正確な情報を得る唯一の方法は、試してみることです。両方を実装して、アプリケーションで何が起こるかを確認してください。そうして初めて、あなたのケースでどちらが優れているかがわかります。

于 2010-09-16T00:20:10.263 に答える