トップ 最新 追記

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|

2017-11-02 [長年日記]

_ [雑記]富士通のPC部門がLenovo旗下に

前から噂されていた富士通のPC部門の切り離しですが、 プレスリリース によればLenovo旗下に入ることが正式に決まった模様

結果、国内薄型ノートPCベンダーの内 NECと富士通がLenovo旗下に入ったことに…

残るは、最近話題の東芝ぐらい?(Panasonicは薄さ競争に参加してないので除外)


2017-11-14 [長年日記]

_ [Fortran]gfortran上の数学関数について

ISO Fortran 2008追加分の実装状況

  • hypot - GCC 4.4以降
  • erf, erfc, erfc_scaled, gamma, log_gamma, bessel_* - GCC 4.4以降 (3引数bessel_*n は未実装)
  • REAL型 asinh, acosh, atanh - GCC 4.4以降
  • COMPLEX型 Hyperbolic関数 - GCC 4.5以降
  • 3引数 bessel_jn, bessel_yn - GCC 4.6以降

SADの内部実装で使用する数学関数的には、GCC 4.5を最低ラインにすべきか?


2017-11-17 [長年日記]

_ [SAD]tfeintfについて

要素毎に適用可能な数学関数のアルゴリズムドライバ部を提供する関数

  • 引数
    • fun - 実引数・実値な関数
    • cfun - 複素引数・複素値な関数
    • it, ia, v - SAD引数の参照
    • it1, ia1, v1 - SAD戻り値の参照
    • cmpl - 複素数を返すかを示す真偽値
      • falseになっている事例は、Abs, Arg, Gamma0
    • rmin, rmax - 実軸上で funを適用できる範囲
    • ir - リターンコード(0: 成功/-1: 失敗)

cfunに関しては特殊なdummy関数tfdummyを呼び出すケースのコード が含まれるが、複素関数が未実装なケースでir=-1を返すためのもので、適用対象は Gamma0 のみ

cmplが偽の場合、cfunの戻り値は実部のみが返される

SAD引数に対する処理

  1. Real型かつ区間[rmin, rmax]内の場合、funを呼び出す
  2. Number型(Real or Complex)の場合、cfunを呼び出す
  3. List型の場合、再帰処理する
    • 第一階層がNumber型の場合の処理は、直接fun/cfunを呼び出して、再帰呼び出しを抑制している
    • List構築はSAD stack上で行い、真偽値d(Real型を含む), vv(リストを含む)を管理し、itfcomposecへ渡している
    • stack depth checkを行っていない(要対処)

引数のうち、fun,cfun,cmpはコンパイル時に確定するので、テンプレートからコード生成すると分岐処理と関数の間接呼び出しが削減出来る。特に、funcfunが組み込み関数の場合、機械語命令への展開・最適化が期待できる。

テンプレート展開するデメリットは、リスト処理を含んだコードのバリエーションが関数毎に生成されるので、その部分のキャッシュヒット率が低下する懸念がある。影響の大きさは、リストに対する評価頻度に依存する。itfunalocも含めた最適化を行いtable dispatchするケースでは、call/ret削減による効果が大きいと思われる

テンプレート展開自体は、開発時のSAD数学関数追加時にしか行われないので、shell script等の簡易ツールで賄える

直接SADScript評価器からtable dispatchを行うには、entryが2種類必要(SADScript標準インターフェースと再帰用)となるが、function tableを改修するのであれば、再帰的な数学関数用のタイプを用意してしまいtable dispatcher側で処理してしまうのが良いかも

テンプレート展開エンジンに必要な機能

  • fun,cfunの定義
    • 必要に応じて、module参照を行うuse節を生成(必要ならonly修飾を行う)
    • 必要に応じて、呼び出し型宣言を行う
  • 定義した関数をfunction tableに登録するためのメタデータ(SADシンボル名・関数形式・関数シンボル)の生成
    • 生成コード内にコメント形式で埋め込み、後処理で収集する?

2017/11/20追記

cfuntfdummyが設定されるケースも、テンプレート展開時に最適化可能で、ダミー関数の呼び出し自体を削除出来る


2017-11-19 [長年日記]

_ [SAD]itfunalocの再実装

backendの関数テーブルを含めて、モジュールベースでの再実装を行い、dlfunalocとの統合を実施した

dlfunaloc経由で登録した関数については、itfunalocが構成した関数ポインタテーブルから直接ディスパッチ出来る

残っている作業

  • tfefun1にあるmap属性の処理コードをeval_funcに統合し、map属性付き関数のディスパッチを実装する
  • 一部の予約オペレータでnargが負のものがあるが、map/eval array参照がrangeoverしないことを確認する
    • tfseval@src/tfeeval.fでは、narg < 0の際に iaat > 0にならない事がlogic levelで保証されている
    • tfefunrefへのパスで、narg < 0のオペレータ呼び出しが有るかを確認する必要がある
      • 初めからtfefun1側に保護logicを追加すべきか?
  • tfefun1/2/3epの再実装
    • itfunaloc/tefun*ベースの実装をdlfunaloc経由の関数ポインタディスパッチベースの実装に再編する
    • 独立した関数になっていない部分は、tail recursion形式のwrapper関数を実装する
      • function IDとディスパッチテーブルの管理から開放される

2017-11-20 [長年日記]

_ [SAD]数学関数実装のクリーンアップ

三角関数・双曲線関数の複素数版実装を独自実装からISO Fortran2008標準の総称関数に入れ替え実施

バックエンドの実装に対する最適化を期待できる

例えば、BSD libmの場合 ccosccoshを用いて実装されているので、coshcosで実装するFortranコードは不要な変数変換により効率が劣化する

対応関係や枝選択に間違いがないかどうか、テストセットを作って検証する必要がある


2017-11-22 [長年日記]

_ [SAD]数学関数バックエンドジェネレータ

1引数と2引数に対応するtfeintf・tfeintf2相当のドライバコードを生成するジェネレータをshell scriptにて実装

出力されるのは、関数テーブルへの登録を行うinit関数を持つmoduleのFortran 2008ソース

tfeintf2と異なり、2引数のケースに付いても複素数関数のサポートを可能とし、Log[base, x]に関しても log(z2)/log(z1)の形で定義可能とした

テンプレートからのコード生成時に、埋め込む数学関数の式展開を行うので、リスト再帰・組み込み数学関数呼び出しに関しては、外部関数呼び出しオーバーヘッドが低減されているはず

また、コンパイラーが十分賢ければmodule scope内にprivate functionで実装しているlistQ/numberQをinline展開してくれるはず

後は、ひたすらテスト… テストベクター生成器と検査器を作らないと…


2017-11-23 [長年日記]

_ [SAD]Log[x, y]

Log[x_Real, y:{___Real}]なケースを考えると、現行実装のように map属性付きのように振る舞う2引数数学関数の実装が欲しい

もっとも、現行実装のLog[x, y]の実体は、Log[y] / Log[x]なので Length[x]<>Length[y]のケースがうまく定義出来ていない上に、Length[x]==Length[y]の時にMapThread[Log, {x, y}]のように振る舞うのが悩ましいところ

Log[x_Real, y_List]のケースとの整合性を考えるとmap属性扱いで Map[Log[#, y]&, x]の用に振る舞うべきだが、既存のコードとの互換性はどうしよう

_ [SAD]idlist moduleの改修アイデア

ARG1_PROCで function pointerからの呼び出しを外部手続きに移譲している部分をProcedure pointerを使って再実装する

src/sim/unix_pointer_.c内のarg1_callを削除可能になる

_ [艦これ]秋イベント

マップ数は少ないけど、進める手順が多くて面倒…

E1甲作戦、E2乙作戦でクリア

対馬はE2輸送ゲージ2勝利目でゲットしたので、次はE3甲作戦に挑戦

E4は、紫電改四めざして乙作戦に挑戦したいけど、資源と時間に相談果なぁ…


2017-11-24 [長年日記]

_ [SAD]Re/Im/Conjugate実装の怪

Listに対しては、Map的に作用する1引数数学関数として、tfefunrefから tfcmplxf@src/tfeexpr.f経由で実装しており、mode引数は Re/Im/Conjugateに対して1/2/3が割り当てられているのだが、List再帰条件がtflistq(it,ia) .or. mode .eq. 3で設定されているので、

Re[{1, 2+I, I}] -> {1, 2, 0}
Re[a[1, 2+I, I]] -> Re[a[1, (2+I), I]]
Im[{1, 2+I, I}] -> {0, 1, 1}
Im[a[1, 2+I, I]] -> Im[a[1, (2+I), I]]
Conjugate[{1, 2+I, I}] -> {1, (2-I), (-I)}
Conjugate[a[1, 2+I, I]] -> {1, (2-I), (-I)}

のような謎動作となる。 ちぐはぐな動作なので、実装バクっぽぃ

仮に、List以外のコンテナ型に対して作用させるなら

Conjugate[a[1, 2+I, I]] -> a[1, (2-I), (-I)]

を返すべきだと思うが、Complex型もコンテナ型なので Conjugate[Complex[a, b]]は、Complex[Conjugate[a], Conjugate[b]]のように評価すべきという話となり一貫性を欠く

他の数学関数と同様のframeworkで綺麗に実装出来るのだが、この変な挙動に依存したコードが存在したらどうしよう…

_ [SAD]OddQバグ

内部的にOddQ[x_Real] := EvenQ[x+1]で実装しており、内部表現がIEEE754倍精度浮動小数点なので、OddQ[2^53]Trueになってしまう

2^53は、仮数部の最小単位が2になっているので、正の方向の次の浮動小数点は2^53 + 2となり隣の整数値が表現出来ない


2017-11-25 [長年日記]

_ [艦これ]秋イベE3攻略

甲作戦にて海域クリアしました

戦力ゲージ(2) 削り

瑞鶴改二甲/伊勢改/千代田航改二/千歳航改二/瑞鳳改/鈴谷改二(サブ)

大淀改/熊野改二(サブ)/初月改/雪風改/大井改二/北上改二

装備

  • 戦艦は、徹甲弾弾着観測射撃
  • 空母系は、艦攻1艦爆1艦戦2を基本に最小スロットに彩雲1
  • 第一艦隊の航巡は、水上戦闘機キャリア
  • 第二艦隊は、連撃・弾着観測射撃装備を基本形に、初月改を対空カットイン・熊野改二に夜偵・水上戦闘機を積載

進撃ルートは、OPQRS

  • 支援は、道中の砲撃支援とボスマスに2航空隊の全力出撃
  • 第一艦隊の航巡を水上機キャリアにしないと空襲マスが痛い
  • ボスマスにたどり着けば、中破1・2隻居ても昼Sが普通に取れる
  • 出撃 6回・ボスS勝利4回・道中撤退Qマス1/Rマス1

ラスダン

瑞鶴改二甲/伊勢改/千代田航改二/千歳航改二/翔鶴改二甲/鈴谷改二(サブ)

大淀改/熊野改二(サブ)/初月改/大井改二/雪風改/北上改二

削りからの変更点

  • 中破時の火力低下を改善するために瑞鳳改を翔鶴改二甲に入れ替え
  • 迎撃で落とされてしまう第二スロットの艦爆を艦戦に入れ替えて、制空力を底上げ
  • 決戦支援に砲撃支援を追加

進撃ルートは、OPQRS

  • 道中支援の引きが悪かったり、空襲マスで軽空母が中破していると手数が減って、Rマスで事故が起こるので、道中支援のキラ付けは重要
  • 空襲マスで直撃で、大破することもあるので、お祈りは欠かせない
  • 出撃 4回・ボスS勝利1回・道中撤退Rマス2/Pマス1

続くE4は、乙作戦かなぁ

伊400の堀をどうするかが問題だが…

資源消費

ゲージ戦力(1)輸送戦力(2)
燃料300080009000
弾薬200070009000
鋼材200010002000
ボーキ1000200010000
バケツ103130

戦力ゲージ(2)でのボーキサイトの消費が…


2017-11-28 [長年日記]

_ [LLVM]flang on FreeBSD

NVIDIAのLLVM Flangを実験中

取り合えず、FreeBSD環境に portingして write文だけを書いたFortranコードをコンパイル出来るところまで完了

flangがmodified clangを要求するのだが、差分を調べた限り flang向けのfrontend driverを派生させるためのコードを追加しているだけなので、ports/devel/llvm50にlocal patchを仕込んしまう方が便利そうである


2017-11-29 [長年日記]

_ [SAD]EPICS\$CaPutとEPICS\$CaPutCBの違い

調査結果のまとめ

  • バックエンドで呼び出されるCA APIがca_array_putであるかca_array_put_callbackが異なる
  • Putの場合 ca_state APIにて、接続状態(cs_conn)であるかを確認している
    • 確認出来ない場合、CA::Channelメッセージを引数 "put error"で発生させる
  • Put/PutCB成功時は、Nullを返す

_ [SAD]CaMonitor系のCallback実装について

src/CaSearch2.cから繋がっているEPICS CA callbackのまとめ

  • EPICS\$CaAddEvent[]ca_add_masked_array_eventcavalue@CaSearch2.c → tfepicsvaluecb_@src/tfepicsconstatcb.f → CaMonitor@rl[chid]@Packages/CaSad2c.n
  • EPICS\$CaOpen[]ca_create_channelcachange@src/CaSearch2.c → tfepicsconstatcb_@src/tfepicsconstatcb.f → CaMonitor@rl[chid]@Packages/CaSad2c.n
  • EPICS\$CaPutCB[]tfcaputcb@src/tfefun3ep.f → ecaput_@src/CaSearch2.c → ca_array_put_callbackcaputcb@src/CaSearch2.c → EPICS\$PutCB[chid]@Packages/CaSad2c.n

tfepicsvaluecb_tfepicsstatcb_にて、CaMonitor@rl[chid]を検索する部分は共通化出来る 古い実装では、EPICS\$ConStatCB[chid, con-stat]EPICS\$ValueCB[chid, value, stat]を呼び出していた様で、Packages/CaSad2c.nに痕跡が見られる


2017-11-30 [長年日記]

_ [LLVM]LLVM/Flang ports

作ってみたが、devel/llvm50に合わせると、flang driver側のmodule search pathとlibrary search pathが埋め込めてないのか、-I/-Lオプションが必要になるので、もう少し作業が必要の模様

少なくとも、-I/-Lオプションをつければ ISO_C_BINDINGS moduleを使ったコードがコンパイル出来ることは確認出来た

_ [SAD]EPICS CA実装の調査

EPICS\$ValueCB及びEPICS\$ConStatCBの旧実装に関しては、 関数プロトタイプがPackages/CaSad2.n及びPackages/CaSad2c.nで同一なので、旧実装ではどちらのフロントエンドも許容できたが、現行のバックエンド実装は直接CaMonitor@rlに格納されているハッシュ経由でCallbackによる書き込みを実装しているので、Packages/CaSad2c.nの実装は動作しない状態にある

CaOpenMonitor実装(Packages/CaSad2.n)は動作不能な状態なので、削除してもリグレッションは起こらないと考えられる

また、CaOpenMonitorで実装されたアプリケーションを動かす必要が生じた際には、CaMontor対応に書き換えるもしくはCaMonitorのwrapper libraryとして再実装することで対応できる

また、cachange & cavalueハンドラからEPICS\$ConStatCB & EPICS\$ValueCBを呼び出さなくなったのは、MAIN trunk r1282(1999/05/10 12:01:37 JST)のコミットからである

_ [SAD]CaMonitorまわりのクリーンアップ作業予定

作業予定をまとめておく

  • EPICS\$CaPut及びEPICS\$CaPutCBの実装系 tfcaput, tfcaputcb, ecaputをクリーンアップしてフロントエンドを統合する
    • direct dispatchするためには、func_tableの拡張も必要
    • この段階で、src/tfefun3ep.fからEPICS CAの実装が分離出来る(残っているのは、src/DbStatic.cと組み合わさったEPICS DB実装のみになる)
  • EPICS\$PutCB経由で実装されている caputcbをcachange, cavalueと同様にCaMonitor@rl経由の直接実装に書き換える
  • cachange, cavalue, caputcbでCaMonitor@rl[chid]の参照部は共通なので、inline関数の形で括り出す
    • instanceアクセスに使うSymbol参照の初期化コードを括り出す(最終的には、func_tableへの登録時に初期化する)

_ [艦これ]秋イベE4突破

乙作戦を潜水空母デコイ編入志摩艦隊ルートにて攻略

山城改二/利根改二/扶桑改二/山雲改/満潮改二/時雨改二/伊13改

戦力ゲージ(1)

  • 削り 2S+2A/7出撃
  • ラス 2A/5出撃
  • 消費資源 8k/11k/5k/1k

戦力ゲージ(2)

  • 削り 2S+1A(旗艦撃沈1)/5出撃
  • ラス 1S/1出撃
  • 消費資源 6k/6k/1k/1k

前評判通り、戦力ゲージは第二段階の方が楽だけど、お祈りマスが多いのでここで伊400を掘るのは精神的にきつそう orz

道中が短いE3堀か?でも甲作戦な罠


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