重力計算再考

CUDA Example にも乗っている重力系の計算だが、

x2+y2

の計算では二乗した時にオーバーフローが発生する可能性がある。CPU を使う計算では、

x2+y2 =|x|1+(yx)2 x > y, |y|1+(xy)2 y > x

と場合分けして計算するのが常套だったらしいが、CUDA のようなベクトル演算では場合分けは著しくパフォーマンスを落としてしまう。

そこで、2次元限定ではあるが、以下のように式を変形してみた。

|x|2+|y|2= 12(|x|+|y|) [1+(|x||y||x|+|y|)2]

(|x||y||x|+|y|)2

は 0 以上、1以下なので、二乗計算でも発散は回避できる。

投稿者について
みのしす

小さいときは科学者になろうとしたのに、その時にたまたま身に着けたプログラミングで未だに飯を食っているしがないおじさんです。(年齢的にはもうすぐおじいさん)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です