2012-02-16 34 views
4

同じ値を計算する方法が複数ある場合があります。どちらがより効率的で、atan2かsqrtですか?

今、私は2次元凸多角形を「展開」するアルゴリズムを考え出しています。これを行うために、私は各頂点を摂動する方向を見つけたいと思う。同じ厚さの「スキン」を有するポリゴンを全周に展開する結果を生成するためには、その方向で摂動する量も頂点での角度に依存する。しかし、今私は方向性が心配です。

atan2を使用する方法の1つは、Bを私の頂点、Aを前の頂点、Cを次の頂点とすることです。私の方向は「角度平均」angle(B-A)angle(B-C)です。

もう1つの方法は、sqrt:unit(B-A)+unit(B-C)です。unit(X)X/length(X)の場合、私の方向のベクトルが得られます。

平均角度値が少しの作業を必要とするので、方法番号2に向かって傾いています。しかし、私は基本的にatan2への2回の呼び出しとsqrtへの2回の呼び出しのどちらかを選択しています。どちらが一般的に高速ですか?シェイダープログラムでこれをやっていたらどうでしょう?

私は自分自身でプログラムを最適化しようとしているわけではありません。これらの機能が一般的にどのように実装されているかを知りたいのです(標準のCライブラリなど)。より良い選択。

私が知っているので、sqrt関数とtrig関数の両方では、答えに到達するための反復メソッドが必要です。これが、可能な限り避けようとする理由です。人々はルックアップテーブルや補間などを使ってより速い結果を出す "近似"関数を思いついた。これらのルーチンやルーチンに深く関わっているためにコードにボトルネックがあるという強い証拠が見つからない限り、私はもちろんこれらを気にすることはありませんが、sqrt、trig funcs、およびinverse trig funcsの違いは、 。

+2

ベストアンサーは、あなたが試してみることです。 – madth3

+0

「拡大」を「縮尺」とすると、各ベクトルに定数を掛けることができます。 –

+0

@ BlueRaja-DannyPflughoeft表現がそのようなことを許すなら、それは便利だろう。もし私がポリゴンの重心を知っていれば。重心の計算にはクロスプロダクトのみが含まれるため、ここに何かがあるかもしれません! –

答えて

19

一般的な現代的なハードウェアの典型的なライブラリでは、sqrtatan2よりも高速です。 atan2の方が速い場合もありますが、それほど多くはありません。

最近のx86実装では、実際にはかなり効率的なsqrt命令があり、そのハードウェア上での違いは非常に劇的なものになります。インテル®最適化マニュアルは、単精度の平方根をSandybridgeでは14サイクル、倍精度の平方根は22サイクルと見積もっています。良好な数学ライブラリでは、atan2のタイミングは一般的に100サイクル以上の近傍にあります。

+1

これは私が探している情報の種類です!ありがとう –

1

自分でプロファイルして調べる必要があるすべての情報があるようです。

あなたが正確な結果を見ていない、そしてそれを動作させるために必要な追加のロジックを気にしない場合は、次の2つの高価な操作を組み合わせることが、1/sqrtを計算し、そのようなRSQRTSSRSQRTPSなどの特殊な操作を、使用することができます。

+0

最近のバージョンの 'gcc'がこれらの命令を使ってコードを最適化できるかどうか知っていますか? –

+0

@StevenLu:はい、-mrecipオプションを参照してください。 – janneb

+1

そして、警告の言葉として、逆数近似命令はそのままではなく、ニュートン・ラプソソン反復の最初のステップとして使用することを意図しています。 – janneb

0

実際、sqrtはatan2よりも優れており、1/sqrtはsqrtよりも優れています。

内蔵されていないソリューションについては、CORDIC approximationsに関心があります。

しかし、あなたの場合、超越関数は計算のほんの一部であるため、完全な式を開発し、結論を導く前にそれらをグローバルに最適化する必要があります。

関連する問題