トップ «前の日記(2017-12-12) 最新 次の日記(2017-12-15)» 編集

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|

2017-12-14 [長年日記]

_ [SAD][EPICS]送信バリアの見直し

オリジナル実装の送信バリアのまとめと考察

  • EPICS\$CaOpen - ca_flush_io/ca_pend無し
    • connection handler付きなので、これで正しい
  • EPICS\$CaAddEvent - ca_flush_io/ca_pend無し
    • 次の送信バリアまで、queuingされている
  • EPICS\$CaPut/CaPutCB - ca_flush_io有り
    • 複数のca_putを扱うためにScanすると要素毎に ca_flush_ioが走るのは非効率的
    • 送信バリア付きなら、CaWrite2のようなインターフェースが欲しい
      • 戻り値は、Nullなので引数形式を拡張しても問題ないが、どちらが便利か
        • Apply形式 f[{chid1, val1}, {chid2, val2}...] (CaWrite2の類型)
        • Map形式 f[{{chid1, val1}, {chid2, val2}...}]
    • 送信バリアを外すのも一考
      • CaMonitorクラス側で、lazy EPICS\$CaFlushIOを実装する
      • Tkinterを前提にしているので、AfterIdleを使って送信バリアをIdleTaskまで遅延させる
  • EPICS\$CaClearChannel/CaClearEvent - ca_flush_io/ca_pend無し
    • 次の送信バリアまで、queuingされている
  • CaOpen1/CaOpen2 - ca_pend_io有り(同期接続)
  • CaClose1 - ca_pend_io有り
    • ca_clear_channelなので、ca_flush_ioで十分のはず
  • CaRead1/CaRead2 - ca_pend_io有り
  • CaWrite1 - 暗黙のca_pend_io有り(内部的にca_get動作を含むため)
    • ca_put直後のca_pend_ioは、ca_flush_ioで十分のはず
  • CaWrite2 - ca_flush_io/ca_pend無し
    • API設計的に、ポーリングを期待していないので、ca_flush_ioするべき

_ [SAD][EPICS]API拡張の検討メモ

  • CaClose1/EPICS\$CaClearChannel/EPICS\$CaClearEvent
    • chidを引数に、資源開放を行いNullを返すAPIなので、複数資源の同時開放サポートを自然に導入出来る
  • CaOpen2
    • PV待ちでタイムアウトした場合、例外メッセージを返し確立済みの全接続を破棄するが、接続マネージャのバックエンドに使うには確立済みの接続は返して欲しい
    • 接続失敗を示す返り値に選択の余地有り
      • 0(無効chid slot番号) - 有効な番号と同型(Real)
      • \$Failed - RealQで有効性を判定出来る(典型的なリソース割り当てAPIの失敗戻り値)
    • =後方互換性を考えるとCaOpen3もしくはCaOpen\$を創設すべき?=CaOpen1[{pvname...}]形式でタイムアウトしたpvnameに対して$Failedを返す実装を導入
      • オリジナルのCaOpen1は、String型引数1個のみのサポートなので、引数エラー以外の互換性に影響しない
    • Tkinterを前提にして良いのなら、接続マネージャをEPICS\$CaOpenベースで実装すべき
      • 一時的な接続断に対しても自動での再接続を期待できる
      • Tkinter無しでもEPICS\$CaPendEventとSleepを組み合わせてポーリングで実装する解がある
        • Sleep時間単位で待ち時間が量子化されるので、CPU負荷と効率のバランスが難しいところ
        • デフォルトの最大待ち時間は、EPICS\$CaOpenTimeoutで拾う
        • EPICS\$CaOpenのconnection handlerが暗黙のうちにCaMonitorをロードする
        • CaMonitorパッケージロード時に評価されるCaMonitor@DoPeriodicIO[]内に含まれるAfterから暗黙のうちにTkinterが初期化される
          • 最初のca_create_channel時点で、eca_fd_register callbackが呼び出されるので、この時点でTkinterが存在しない場合、polling用の fdが行方不明になる(TkinterがDynamicLoadのケース)
          • DynamicLoad前提の場合、sadTk_CreateFileHandler wrapperにQueuingが必要となる
          • おそらく、CaMonitorの接続の場合、Tkinterにfd callbackが設定出来れば、ca_pend_ioの定期実行は不要なので、DoPeriodicIOは廃止出来る
          • ただし、EPICS\$CaOpen/CaAddEvent/CaClearEvent/CaClearChannel要求を送出するために遅延した・定期的なca_flush_ioが必要
            • CaMonitorクラスメソッドからの送出で有れば、Lazy EPICS\$CaFlushIOを仕込めば足りる
          • 以下のコードで暗黙のTkinterロード以外は、意図通りに動く
CaOpenX[pv:{__String}] := Module[{chl = EPICS$CaOpen/@pv, dt = 10e-3, timeout = EPICS$CaOpenTimeout[]},
  While[timeout > 0,
    Sleep[dt]; timeout -= dt; EPICS$CaPendEvent[];
    Print[timeout];
    If[And@@(CaConnectedQ/@chl), Break[]]];
  Map[If[CaConnectedQ[#], #, EPICS$CaClearChannel[#]; $Failed]&, chl]];
  • EPICS\$CaOpen
    • 複数のPVを同時に開く拡張が考えられる(上記のCaOpenXの様な事例でMapを一つ減らせる/関数呼び出し分早くなる)
    • 後方互換性を考慮すると、EPICS\$CaOpen[chid..]形式では1引数と2引数以上で戻り値型を_Realと{__Real}で切り替える形式となる
      • 従って、リストを受けるコードを汎用で書くケースでは、Flatten[{EPICS\$CaOpen[pv...]}]となりコードが増える
        • 評価コスト的には、リストの長さ分EPICS\$CaOpenをMapから評価するのに対して、Flatten[]とList[]の評価が増えるだけなので、長いリストでは安くなるが、リスト長に線形にFlattenがSAD stackを消費する
      • 素直に、EPICS\$CaOpen[{pv...}]をサポートする方が簡単?=実装した
        • 内部エンジンをit/iaペアを受ける1引数バックエンド(String/String-Listのみサポート)と引数検査を行うフロントエンドに分割して実装する=
  • CaConState1
    • 戻り値が、独自フォーマットなのが使い難い
    • 接続状態判定だけなら、真偽値で欲しい
      • =新説するなら、=CaConnectedQ=辺りか?=を実装した
      • Query関数にするなら、無効な引数に対しては、Falseを返すべき?

_ [SAD]mmap_utils回りの書き換え済みコードについての覚書

tffsmatchで割り当てた領域がtffscalcに渡しているケースで、tffscalc内部で並列化する場合に、並列リージョンからの書き戻し動作の挙動が変わっていないかソースを精査する必要あり

_ [SAD][EPICS]EPICS backendの残作業まとめ

  • 実働・通信テスト
  • CaOpen/CaClose/CaRead/CaWrite wrapperの再実装(Packages/CaSad.n)
    • 複数レコードへの接続要求の効率的な処理(拡張されたCaOpen1)
    • CaCloseのサポート
      • 現行実装では、チャンネル切断時に二度とアクセス出来なくなる(chidの再生成をサポートしていない)
    • 可能なら、EPICS\$CaOpenベースへ移行する
      • connection handler付きであれば、IOC再起動時などは自動での再接続を期待出来る
  • EPICS\$CaPut/CaPutCBから ca_flush_ioの排除
    • CaMonitorクラスのLazy FlushIO化(Put/PutCB/Start/Stop/Constructor/Destructor)
  • TkinterのDynamic Loading対応
    • Tk_CreateFileHandler wrapperでのQueuingサポート
  • CaMonitorから DoPeriodicIOの排除
    • 送信バッファのca_flush_ioは、Lazy FlushIOが実施
    • ca_pend_eventは、eca_fd_callbackが担当する

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