質問

1/30秒ごとに約2000回の平方根を計算する必要があるiPhoneアプリを作成しています。 SQRT()はコンピューターで正常に動作しますが、フレームレートはiPhoneまたはiPadで約10 fpsに低下し、すでにコードの残りの部分を最適化しています。平方根を推定することでこれを劇的に上げることができると聞いたことがありますが、これを行うコードを見つけることはできません。正確な小数点以下の場所は1つまたは2つしか必要ありません。これを行う方法に関する提案、または物事をスピードアップする他の方法は大歓迎です。

ありがとう!

役に立ちましたか?

解決

見積もりをどれほど正確にしたいですか?あなたがあなたの見積もりを実際のsqrtにどれだけ近くに望んでいるか知っているなら ニュートンの方法 あなたの友だちです。

SQRTに渡される値の範囲を知っていますか?その場合、スタートアップで事前に計算される検索テーブルを作成できます(または、より速くなることに応じて、スタートアップのディスクから読むこともできます)。入力にテーブル内の最も近いものを見つけて、見積もりを取得します。

他のヒント

あなたが実際にない限り 必要 平方根は、生の値と平方根ではなく、四角値を比較します。

比較だけが必要な場合は、平方根を取るよりもはるかに速い(そしてより正確です)。これは、ほとんどのゲームのやり方です。

平方根を見つけようとしている価値の範囲を知っていますか? 0から10の範囲の値があるとします。次に、配列を事前に計算できます。

sqrt_val[0] = 0;
sqrt_val[1] = 1;
sqrt_val[2] = // the sqrt of 2
...
sqrt_val[10] = // the sqrt of 10

次に、ランタイム中にSQRTが必要な数を取得し、それを整数に変換し(たとえば3.123が3になります)、それをインデックス(3)として使用して事前計算値を調べます。

もちろん、より細かい解像度が必要な場合は、配列内のアイテムの数を増やすことができます。

まず、平方根が実際にボトルネックであることを確信していますか?プロフィールしましたか?携帯電話でさえ、1/30秒ごとに2000平方根ごとに実際にはそれほど多くはありません。アームドキュメンテーションは、単一程度の平方根の場合は33サイクル、二重精度の60サイクルを引用しています。 600MHzプロセッサが実行できます 千万 1秒あたりの平方根(命令がまったくパイプライン化されている場合)。

あなたがプロファイルしていて、正方形のルートが本当にボトルネックである場合、あなたはネオンを使用したいと思うでしょう vrsqrte.f32 命令。この命令は非常に速く、4つの浮動小数点数のおおよその逆方式の根を同時に提供します。次に、を使用できます vmul.f32 近似平方根を取得するための指示(ただし、多くの場合、相互の使用は平方根自体よりも有用です)。

多分これはあなたのためです:
高速逆平方根
この方法が必要な精度を提供しない場合、速度と精度の間に多かれ少なかれ正確な選択を可能にする他の多くの反復方法もあります。
正方形の根を計算する方法

iPhoneでできる最も簡単な変更は、SQRT()の代わりにSQRTF()を使用することです。特に3GSビンテージ以下のデバイスでは、単一の精度フロート数学は、2倍の精度よりもはるかに高速です。

Pythagorasの三角形(SQRT(x*x + y*y))を計算するために平方根が必要な場合、xとyの両方が非陰性である場合、それの非常に高速な近似はです。

max(x,y) + min(x,y)*0.333

これは5.7%の最大エラーです。ただし、min()およびmax()のブランチの誤解に注意してください。

intではなく「通常の」ポジティブフロートまたはダブルがあり、テーブルルックアップ方法を使用したい場合は、2つの別々のテーブルルックアップを行うことができます。マンティッサのビット(シフトとマスクビットフィールドの抽出)は、2つのテーブルに合わせて結果を調べます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top