トップ «前の日(03-04) 最新 次の日(03-06)» 追記

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|

2008-03-05

_ [SAD]最適化への考察

ここ最近、SADをコンパイル時の最適化レベルを上げてコンパイラのバグを 踏んづける事例が何例か報告されていますが、i386系で GCC使う場合 -O1-O2ってそんなん差が出ます? 多分、Intel Fortranを使う方が全然はやいと思うのですが... (昔からGCCの-O2は怪しい環境が多いのです)

あと、数値計算だと内部的にいろんなコードが使っている 線形代数や FFTのコードを最適化済みの(例えば、SSE/Multi Threadに 最適化した)ライブラリに置き換えた方が、早くなりそうな気がします。 おまけに、外部化すれば保守が簡単に...

特に、線形代数ライブラリーに関しては、BLAS/LAPACKという デファクトスタンダードな APIがある上に、有償ですが ベンダーが最適化済みのものを提供しています

FFTに関しては、fftwかな?

以下の三つのファイルがコンパイル出来ないのでSADのベンチマークは 取れていませんが、フリーのコンパイラでは LLVM-GCCが期待大です (小さなプログラムでは Intelコンパイラに近い性能が出ます)

  • src/tfearray.f
  • src/tfeexpr.f
  • src/tfbessel.f

2012-03-05

_ [FreeBSD]Apache + Passenger

Redmineを動かしていると、log rotateのタイミングで Apacheが HUPシグナル 経由でリスタートした後に Redmine側がおかしくなるようだ。 多分、Apacheのstop-startの間に Passengerの終了処理が完了しないために 競合が発生してセッション管理がおかしくなるっぽい

下記の手順で正常化するようだ

  1. Apacheを停止し、Passengerの終了処理完了を待つ
  2. rake tmp:sessions:clear
  3. rake tmp:cache:clear
  4. Apache再起動

2018-03-05

_ [SAD][EPICS]ValueTypeオプション拡張

  • PVリストに対して、個別の転送型指定が出きるようにList型のValueTypeオプションをサポート
  • DefaultValueTypeオプションの導入
  • ValueType[]・SetValueType[]メソッドによる動的参照・更新のサポート(Countオプションと同じ)
  • ValueType[] = new, Count[] = new構文による動的更新サポート

次は、Constructor拡張?

_ [SAD][EPICS]CaRead2実装用CaMonitor`Constructor案

実装アイデア

  • ClearChannel抑止オプション付きの状態で、専用のCreateChannelを呼び出す
  • 引数列は、修飾付きchidのリストのみを処理する
    • 不正な引数列を受けたときの動作は未定義で良い
  • count/vtypeに関しては、chidへの修飾子から自動設定
  • AutoStartは、False
  • 未接続のchidに関しては無視すると後処理が楽?
  • GetCBの自動発行まで実装するか?
    • WaitValueするコードで駆動するので、そこまで行う自動化する必要は無い
  • CaMonitorで登録済みのchidが渡されるケースで表面化する問題点
    • Fortran backendからCaMonitorへのcallbackが多重登録出来ない
    • ca_get_callbackと subscriptionからのcallbackをSADScript側で識別できない
    • subscriptionされていない場合は、callbackの登録を一時的に改変する余地が有る
      • Destructorで復元する必要が有る
      • Destruction前に、AutoStartや明示的なStart[]が呼び出されると面倒
    • CA接続を一時的に作る場合、失敗する可能性が残る

_ [SAD][EPICS]別解として、ca_get_callbackベースで実装したCaRead3の導入

実装アイデア

  • dbr_time型のバッファへwrite backする専用callback routineを渡したca_get_callbackを発行する
  • timestamp fieldを無効値で初期化して、更新検知する
  • 全てのcallbackが完了するまで、ca_pend_event + pollingでblocking waitをかける

問題点は、timeoutまでに応答しないcallbackが有った場合に、ca_get_callbackをキャンセルするか、書き込み先の消失を指令するメモ領域が必要(メモ領域はcallback routine側で開放する必要がある)

callbackメモの内容

  • 返り値のListオブジェクトの参照と内部インデックスで十分
  • キャンセル時は、参照もしくはインデックスを無効値に書き換える
  • 返り値のListオブジェクトは、Table[\$Failed, {n}]で初期化しておく
    • 更新検知は、タイプの変化で検出(ntfsymbol→ntflist)
  • callback contextが、ca_pend_*に限定されれば、更新競合は避けられる
  • ca_get_callbackは、callback routineと共にメモのアドレスを渡す
  • メモはcallback routine側で開放可能とするために、heapから割り当てる必要あり
    • caの割り込み(callback) contextから安全に開放可能でなければならない
  • 別案として、メモを管理する機構を設けて、安全なcontextから完了済みのメモを回収することも出来る
    • この場合、ca_get_callbackごとにメモを生成し、callback routineは処理完了マークをメモに記入する
    • GCは、安全なcontextから起動し、完了済みのメモを回収する
    • GCと割り当てが同時実行されないのであれば、簡単な単方向リスト構造で足りる
    • GC発動タイミング候補
      • CaRead3起動時、完了時

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