トップ «前の日記(2008-03-28) 最新 次の日記(2008-03-30)» 編集

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|

2008-03-28 [長年日記]

_ [SAD][LLVM]SAD on LLVM-GCC

27日の日記でLLVM-GCCを使ってコンパイルしたSADだが、 common block回りの不具合原因が判明。

ここで問題です、次の Fortranコードを llvm-gfrotranで コンパイルした場合、どんな結果が出力されるでしょう?

     implicit none
     integer*4 i
     logical*4 flags(64),flag1,flag2,flag3
     common /tflags/flags
     equivalence (flag2,flags(2))
     equivalence (flag3,flags(3))
     do i=1,64
        flags(i)=.false.
     enddo

     write(*,*)'Clear:'
     write(*,*)'flags(1)=',flags(1)
     write(*,*)'flag1=',flag1
     write(*,*)'flags(2)=',flags(2)
     write(*,*)'flag2=',flag2
     write(*,*)'flags(3)=',flags(3)
     write(*,*)'flag3=',flag3

     flag2=.true.

     write(*,*)'After: flag2=.true.'
     write(*,*)'flags(1)=',flags(1)
     write(*,*)'flag1=',flag1
     write(*,*)'flags(2)=',flags(2)
     write(*,*)'flag2=',flag2
     write(*,*)'flags(3)=',flags(3)
     write(*,*)'flag3=',flag3

     do i=1,64
        flags(i)=.false.
     enddo

     write(*,*)'Clear:'
     write(*,*)'flags(1)=',flags(1)
     write(*,*)'flag1=',flag1
     write(*,*)'flags(2)=',flags(2)
     write(*,*)'flag2=',flag2
     write(*,*)'flags(3)=',flags(3)
     write(*,*)'flag3=',flag3

     flags(1)=.true.

     write(*,*)'After: flags(1)=.true.'
     write(*,*)'flags(1)=',flags(1)
     write(*,*)'flag1=',flag1
     write(*,*)'flags(2)=',flags(2)
     write(*,*)'flag2=',flag2
     write(*,*)'flags(3)=',flags(3)
     write(*,*)'flag3=',flag3

     flag1=.false.

     write(*,*)'After: flag1=.false.'
     write(*,*)'flags(1)=',flags(1)
     write(*,*)'flag1=',flag1
     write(*,*)'flags(2)=',flags(2)
     write(*,*)'flag2=',flag2
     write(*,*)'flags(3)=',flags(3)
     write(*,*)'flag3=',flag3

     end

Subversion resporitory revision 48818での結果は、以下の通り。

Clear:
flags(1)= F
flag1= F
flags(2)= F
flag2= F
flags(3)= F
flag3= F
After: flag2=.true.
flags(1)= T
flag1= F
flags(2)= F
flag2= T
flags(3)= F
flag3= T
Clear:
flags(1)= F
flag1= F
flags(2)= F
flag2= F
flags(3)= F
flag3= F
After: flags(1)=.true.
flags(1)= T
flag1= F
flags(2)= F
flag2= T
flags(3)= F
flag3= T
After: flag1=.false.
flags(1)= T
flag1= F
flags(2)= F
flag2= T
flags(3)= F
flag3= T

要するに、EQUIVALENCE文に配列を添字付きで与えた場合、 添字の部分が無視されているようです。

バグ 1971でも EQUIVALENCEの不具合が報告されている模様です。

SADは、common blockEQUIVALENCEを多用してるので このバグが直らない限り、LLVM-GCCを使うのは絶望的です。

_ [SAD]CVS repository考古学

SADの CVS repositoryから調査用に変換生成した Subversion repositoryを あさってみると...

  • 現在の CVS repositoryは1995/09/13に初期化された
    • SADの開発は、1986年ごろに始まっている
  • CVS repositoryに実際にコミットしたことのあるコミッターは、9
    • 最多コミッターのコミット数は、全体の66.9%を占める。
    • コミット数は、第一位から66.9%,13.7%,12.2%で上位3コミッターが全体の92.8%を占める(コミット数なので、コード行数ではないことに注意)
  • CVS repository上のコードで、始めて動作したものは 1995/09/15と思われる(コミットメッセージは、working Alpha version 1.0)
  • src/MAIN.fへ Version番号が格納されるようになったのは1997/02/06、最初のVersion番号は1.0.1bである。

といったことが、分かりました。

開発形態は、少数精鋭による典型的な伽藍モデルのようです。

あとは、CVS repository導入直後から現代までのコード行数の変遷でも 調べて見るべきか?

本日のツッコミ(全1件) [ツッコミを入れる]
_ Y氏 (2008-04-11 07:57)

バグ1971は直ったようですね。


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