ToDo:
a=min(.99d0,px(i)**2+py(i)**2) dpz=a*(-.5d0-a*(.125d0+a*.0625d0)) dpz=(dpz**2-a)/(2.d0+2.d0*dpz) dpz=(dpz**2-a)/(2.d0+2.d0*dpz)
dpz := Sqrt[1-s] - 1 (但し、s := px^2 + py^2, 0 =< s < 1)を 3次まのでマクローリン展開を種に2回Newton改良を行った近似式
ハードウェア化された開平器がある場合は、素直に計算した方が早いかも...
この場合、s〜0近傍の桁落ちを考量し、dpz := -s / (1 + Sqrt[1 - s])で計算する方が良い(除算一回分不利)
Rythen Threadripper 2950X(Zen+)で、DRIFTを大量に詰め込んだ状態でベンチマークで比較したが、 Newton改良2回のコードと-s/(1+sqrt(1-s))では有意な差が出ない(-O3 -ffast-math時)
コードの改変に対するCPUタイムの変化を調べてみたが、
有意な差がでるので、ボトルネックにはなっている模様
ちなみに、-ffast-mathを外すと-s/(1+sqrt(1-s))はNewton改良2回のコードよりも有意に遅い
全域での精度を考えると、-ffast-math付きでsqrtを使う方が良さそう…
DRIFTとQUADに実装されているが、動作が異なる
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記