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

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|

2019-12-09 [長年日記]

_ [SAD]equivalence array VS array pointer

memory allocator更新に向けて、equivalence arrayを参照しているコードを順次array pointer参照に書き換えているが、性能が下がっているっぽい

置き換え前

CompilerFunctionOpticsTrackingMatchingOverall
flang -O30.73760 ± 0.018161.45360 ± 0.012420.55039 ± 0.017730.09693 ± 0.001060.03945 ± 0.00064
gfortran -O30.80652 ± 0.007451.64528 ± 0.011970.54286 ± 0.003750.10905 ± 0.001060.04313 ± 0.00030
  • 使用コンパイラ(以下同様)
    • flang 7.0g20191020
    • gfortran 9.2

*stk置き換え後

CompilerFunctionOpticsTrackingMatchingOverall
flang -O30.81291 ± 0.010021.45929 ± 0.013680.54700 ± 0.003360.09879 ± 0.000830.04128 ± 0.00037
gfortran -O30.86364 ± 0.007001.65001 ± 0.010530.54365 ± 0.004450.10941 ± 0.001230.04455 ± 0.00026

*list置き換え後

CompilerFunctionOpticsTrackingMatchingOverall
flang -O31.15773 ± 0.007001.51878 ± 0.009630.55605 ± 0.005550.10194 ± 0.001100.05024 ± 0.00026
gfortran -O11.15793 ± 0.012061.73687 ± 0.014380.80146 ± 0.009180.11540 ± 0.001220.05521 ± 0.00050
gfortran -O2 -fno-strict-aliasing1.12681 ± 0.011551.75418 ± 0.018130.78415 ± 0.006930.11625 ± 0.001650.05448 ± 0.00046
gfortran -O3 -fno-strict-aliasing1.09313 ± 0.009451.67546 ± 0.012450.54557 ± 0.004130.11088 ± 0.001120.05032 ± 0.00035
  • gfortran -O2/-O3だと途中でSEGVする
    • 独立なポインタ間のメモリーイメージが重複しているが、level 2から有効になる-fstrict-aliasingオプションによって異なる型のarray pointerなので独立しているものとして最適化されている模様
    • そして、ISO Fortranには共用体は標準化されていない
      • ISO Cの共用体は言語仕様レベルで、メモリイメージが共用されることを宣言しているので、strict-aliasingルールの適用外になる
  • WORKAROUND
    • -fno-strict-aliasingでコンパイルする(移植性は無い)
    • 最適化スコープ内で、同一領域に異なる型のポインタによる読み書きを避ける(コードの書き直しが必要/意図が見えにくい)
    • aliasを使わずに、TRANSFERで明示的に変換する(コードの書き直しが必要/煩雑になる)
    • setterを外部手続き・関数化して、最適化スコープを切断する
      • 対象ポインタは common block上に存在するので、呼び出した外部手続き・関数から更新可能。したがって、外部手続き・関数を跨いでarray pointer操作を最適化出来ないはず(未検証)

考察

  • equivalence arrayからarray pointerへの置き換えで、Functionの性能が大きく下がっている
    • オブジェクトコンテナの参照頻度が高いベンチマークで影響が大きい
    • Fortranのarray pointerは、添字の下限・上限及びストライプ幅の概念を持つある種のスマートポインタなので、配列参照に比べて添字計算コストが高い模様(最低でも1乗算・1加算演算増える)

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