ToDo:
現行コードではOpenSharedに成功時に、先頭アドレスが表現域内かつ終了アドレスが表現域外なケースが存在し、dump/restoreコード内のrlist配列のアドレス計算時に32bit符号付き添字演算がオーバーフローしてSEGVに至るケースが存在する(Linux/x86_64)
正しく、64bit対応にする際にやるべきこと
内部実装を確認したところ、参照動作時にpack表現内部のreference位置とheap/stack系のreference位置が同一視できることを前提にコーディングされている
アドレス空間を分離する為に再実装するのであれば、pack表現も見直した方が良い模様
多分、stdint.h + union + switchで Cで書き直す方が移植性的には素直
オブジェクトキャッシュの実装は、SAD stack or Heapは考えておくべき (最悪、リストの長さの合計スケールのstackが必要) dump側で辞書領域の大きさを書き出しておくと、 restore側は辞書のrealllocationが不要になる
少なくとも型フィールドが余っているので、リストの種別毎にデータ構造を分離する(List of Reals, List of Non-Real, Generic List)することで、特化リストの格納効率を上げられる(iad/iavが不要になる)
また、混合リスト時の表現もReal型フラグベクトルを導入すると圧縮出来る
uint64_tにするか uint32_t 2語でデザインするかは一考
unit64_tだとイテレータループが単純になるが、32bit環境だと型が存在しない可能性がある
長いリストの場合、64要素当たり 64 * 16bytes -> 8 + 64 * 8bytes 短いリストの場合、2要素の時 2 * 16bytes -> 8 + 1 * 8bytes (1要素の場合は、自明なリスト構造)
recall動作時に型判定・再帰動作を含むループを回しているので、動作効率面での劣化は、フラグベクトルの条件判定分のみと推定される
TFRBUFへmmap pointer/sizeテーブルを追加して、生のmmap/munmapを使ったOpenSharedを再実装した
残作業
辞書を使ったpack表現の圧縮を実装した
他のプロセスとの干渉等が原因で、辞書の拡張に一時的に失敗した後に、別のオブジェクト挿入時に拡張に成功するとその間のオブジェクトの登録状態が異なる状態(非決定論的)になるので、拡張失敗時には辞書サイズを凍結するように変更した
さらに、メモリ使用量とテーブル検索時間を制限する為に、辞書サイズに上限を設定した
一応、問題なく動くところまで来た
古いFortranコードに、対象を制限しない形でSAVE属性を宣言しているものがある
一部のコードは、明かに状態を保持していないので、削除すべきか?
これが原因で、特定のコンパイラ系でエラーになるっぽぃ
エラーメッセージは、COMMON属性とSAVE属性を同時に設定出来ないというもので、内容から考えて、環境依存最適化のレベルの問題では無いと思われる
問題が出ているgfortranは、開発途上の古いsnapshotなので、特定revisionでのregressionの可能性が高い、さもなくばRed Hatが変なパッチを当てている?
危険なケース
安全性を保証するには…
結局、ISO Fortran的には、master-worker間の通信に限定して、worker毎に個別の共有メモリを割り当てるのが無難という結論に…
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記