トップ «前の日記(2020-10-03) 最新 次の日記(2020-10-17)» 編集

Orz日記 by Akio Morita

ToDo:

  • 15 SAD Fit[]回りの障害事例の解析
  • 10 smart pointer版PEGクラスの再実装(Left Recursionまわり)
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|06|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|06|07|08|10|12|
2016|01|02|03|05|06|08|10|11|
2017|01|02|03|04|05|06|07|09|10|11|12|
2018|01|02|03|04|06|07|08|09|10|11|12|
2019|01|03|04|05|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2020-10-16 [長年日記]

_ [SAD]解析メモ

頻出コード

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タイムの変化を調べてみたが、

  • Newton改良の段数を減らすと有意に早くなる
  • sqrt(1-s)-1は、-s/(1+sqrt(1-s))より有意に早い (Newton改良1回と2回(標準コード)の中間ぐらい)

有意な差がでるので、ボトルネックにはなっている模様

ちなみに、-ffast-mathを外すと-s/(1+sqrt(1-s))はNewton改良2回のコードよりも有意に遅い

全域での精度を考えると、-ffast-math付きでsqrtを使う方が良さそう…

DISKINパラメータの挙動

DRIFTとQUADに実装されているが、動作が異なる

  • DISKIN DRIFT
    • SOL区間では、DISKINが無視される
    • SPACフラグ時は、DISKINが無視される
  • DISKIN QUAD
    • SOL区間では、DISKINが無視される
    • K1 == 0で帰着するDRIFTは、DISKIN = 0な DRIFT (DISKINが効かない)
    • K1 -> 0の極限で帰着する DRIFTは、DISKIN DRIFTと写像が異なる(少なくとも x, yの px, py依存性は異なる)

APRETの謎機能

  • JDPX, JDPYパラメータが設定されている際に発動する機能
    • ax := Min[|DX1|, |DX2|], ay := Min[|DY1|, |DY2|]で定義される楕円APERTureの外側の粒子を、x,y座標については楕円(ax, ay)上、px,py座標については楕円(JDPX, JDPY)上にランダムに再配置して、g座標のDPに加える
    • g座標更新に伴う随伴するdv座標は更新されない(一貫性が損なわれている)
    • 作用する際の入力-出力間の関係に因果性が無い
  • LWAKE, TWAKEフラグ時に、DX1,DX2,DY1,DY2によるクリップ動作になる
    • 粒子数が変わるとWake計算コードに不具合が有るのか?
    • 物理的な意味論が不自然(現実にはロスは発生する)

カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記