5

ライブラリと、OpenTKMonoTouch および MonoDroid には、(遅いと思われる) をLengthFast使用せずにベクトルの長さの概算を計算するメソッド が含まれています。を使用します。これは、平方根の高速近似を提供する非常に興味深い方法です ( http://www.opentk.com/files/doc/_math_helper_8cs_source.htmlの 172 行目と 196 行目を参照)。Math.SqrtLengthFastMathHelper.InverseSqrtFast

100'000'000ベクトルの長さが約 1 ~ 100 の、両方の計算時間を呼び出す小さなベンチマークを作成しました。

Windows 7 / Intel i7-2600 3.40 GHz では、次のようになりました。

Length:2947 ms

LengthFast:4754 ms

MonoTouch を搭載した iPad 3 では、次の結果が得られました。

Length:51575 ms

LengthFast:41252 ms

そのためLengthFast、Intel CPU でははるかに遅く、iPad の ARM ではわずかに高速です。

これについての説明はありますか?それは、Intel CPU が「ネイティブに」(ソフトウェア近似を使用せずに) 平方根を計算できる結果ですか? LengthFast少なくとも少しは、常に高速であるべきではありませんか?

4

2 に答える 2

3

すべてMathのメンバーは本当に速いです。.NET数学コードを高速化しようとしないでください。ARMプロセッサでは、ARMプロセッサでの同じ実装に必要なX86 / X86_64コマンドが欠落しているため、コードが異なるため、より高速になる場合があります。

于 2012-11-17T12:32:37.133 に答える
1

ソースを見ると、 Quake 3LengthFastのものと基本的に同じビット ハックです。

アルゴリズムは x86 命令用に最適化されていますが、ARM 命令用にはあまり最適化されていません。このアルゴリズムは実際には ARM ではかなり遅いことが文書化されています。

http://omcfadde.blogspot.com/2011/02/math-function-micro-optimization.html

明らかに、このマイクロ最適化が x86 および x86_64 に対して優れていることがわかります。ARM で試さないでください。1.0 / sqrt(x) でヒットするよりもはるかに遅い

編集

逆に読んだことがわかりました... JITがタイミングをいじっている可能性があります。メソッドとクラスの両方が初期化され、JIT されていることを確認するために、タイミング ループに入る前に and を 1 回Length呼び出してみてください。それほど大きな違いはないはずですが、これが出発点です。MonoTouch には JIT がないため、引き続き要因となります。LengthFastMathHelper

于 2012-11-16T21:30:11.737 に答える