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

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-02 [長年日記]

_ [SAD]tffsmatchのutwiss arrayの動的割り当てをFortran pointerベースへ更新

itmmapp経由でrlist内に割り当ててる動的配列utwissの実装をFortran pointerベースの実装に置換した

tffsmatch内部に残っているのは、ifqu/ifqu0でindexしている、 実数型2次元配列 qu(nqcol,nvar)である

rlistから参照するコードなので、読みづらい…

関連するsubroutine

  • tffssetupqu
    • 呼び出し箇所は、数値微分フロー内の並列化直前のみ
      • 数値微分フロー内でnqcolは変更されない
    • ifqu/ifqu0が指す配列をリサイズする(再割り当てする)
    • 配列への格納は、並列workerのループによる
  • tffsqu
    • 呼び出し箇所は、導関数フロー内のみ
      • というか、導関数計算エンジン?
    • 内部で並列化されている
    • tffssetupqu相当のコードを含んでいる
      • 割り当て失敗時は、計算を中断しエラーを返す
    • nqcolを変更しない

関連するコードフロー内で、nvarは定数であり、nqcolはtffscale等で動的に決定され最大値はmaxcond(正確にはmaxcondを越えるとエラー)

技術的には、条件毎の値を保管する配列が長さmaxcondで確保されたものが渡ってくる事に起因する

Fortran pointer渡しにすれば動的に拡張可能となるが、関連するfunction/subroutineのインターフェースを 明示的に宣言することが必要(読み出し・格納のみでリサイズを行わない場合は、宣言なしの配列渡しが可能 Ex. tfshow)

配列渡しによる参照側が(nqcol,nvar)で参照しているので、nqcolが変更された場合アドレッシングレイアウトが変更されるために、アドレッシングの整合性を維持するためにnqcolが減少するケースでもpointerの再割り当てが必要になる

また、mmap_utilsのAPI設計上、munmapに必要な割付長が配列sizeに相関する必要がある

可変長割り当てを考慮すると(nvar,nqcol)の方が良いが、バックエンドに存在する線形代数ルーチンでJacobianを解く際のインターフェースに依存性があり転置するのは面倒が多い

メモリ再割り当て動作を減らすには、mmap_shared/munmap APIを直に使い自前でpointer割り当てを管理するのが最適?

2種類の導関数計算エンジンの外側で、配列割り当てを行う形にコードを整理すべきと思われる

必要なもの

  • 二次元配列ポインタ qu/qu0
  • mmapからが返すtype(C_PTR)値 pqu/pqu0
  • mmapで割り当て済みのinteger(C_SIZE_T)長さ lqu/lqu0
  • 割り当てが一ヶ所ならコードをベタ書きで良い

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