九州大学 情報基盤研究開発センター 研究用計算機システムニュース   No.433  2018.06.08

+--------------------------------------------------------------------------+ |1. 富士通 Fortran コンパイラのデータの処理異常について | +--------------------------------------------------------------------------+ ----------------------------------------------------------------- 情報基盤研究開発センター研究用計算機システムWWWホームページ     https://www.cc.kyushu-u.ac.jp/scp/ ----------------------------------------------------------------- 1.富士通 Fortran コンパイラのデータの処理異常について スーパーコンピュータシステム ITO の Fortranコンパイラにおいて、データの処理異常 となる障害が見つかりました。障害は以下の条件を満たした場合に発生するもので、富士通 製の Technical Computing Suite の Fortran のみが該当します。 障害修正時期は6月末を予定しています。心当たりのある方はセンター (request(at)iii.kyushu-u.ac.jp) までご相談ください。※(at)は@に置き換え なお、こちらの情報は以下URLでも公開しております。  https://www.cc.kyushu-u.ac.jp/scp/users/news/2018/433.html ●現象と条件 [現象] 書式なし流れ探査入出力において、以下の現象が発生する場合があります。 (a) (1)~(3)の条件をすべて満たした場合、データが正しく読み込まれない場合があります。 (b) (1),(4)、および(5)の条件をすべて満たした場合、以下の現象が発生することがあります。 - データが正しく書き出されない。または、 - 実行時のエラーメッセージjwe0022i-sを出力し、プログラムの実行が終了する。 (c) (1),(4)、および(6)の条件をすべて満たした場合、以下の現象が発生することがあります。 - INQUIRE文に指定したPOS指定子およびSIZE指定子の返却値が正しくない。または、 - 実行時のエラーメッセージ jwe0022i-s を出力し、プログラムの実行が終了する。 [条件] (1) OPEN文のACCESS指定子に'STREAM'およびFORM指定子に'UNFORMATTED'を指定している (文字変数による指定または小文字の指定も同様)。 (2) 以下の条件を満たす書式なし流れ探査READ文を実行している。 (2-1) POS指定子に1以外を指定している。または、POS指定子を指定していない。かつ、 (2-2) 直前に実行された文が以下の文でない。 (ア) POSITION指定子に'APPEND'を指定していないOPEN文 (イ) REWIND文 (ウ) 長さ0の文字列または空配列のみを入出力並びにもつPOS指定子に 1を指定した書式なし流れ探査入出力文 (エ) (ア)~(ウ)のいずれかの文の直後に実行した長さ0の文字列または 空配列のみを入出力並びにもつPOS指定子を指定していない書式なし 流れ探査入出力文 (3) (2)の書式なし流れ探査READ文で読み込むデータに、 『入出力バッファの先頭に読み込まれたデータのファイル位置+ ( 入出力バッファサイズ×n(注) )+1』のファイル位置に位置するデータが含まれる。 注)入出力バッファの先頭に読み込まれたデータがファイルの先頭に位置する データである場合はn>=2、それ以外の場合はn>=1。 備考)入出力バッファが空である場合、入出力バッファにデータが読み込まれる。 (4) 以下の出力並びをもつPOS指定子を指定した書式なし流れ探査WRITE文を実行している。 (4-1) 出力並びの長さが入出力バッファ長を超えている。または、 (4-2) 出力並びの長さが入出力バッファ長と同じである。かつ、 最後の出力並びが長さ0の文字列である。 (5) (4)の書式なし流れ探査WRITE文実行直後に、POS指定子を指定していない書式なし流れ 探査WRITE文を実行している。 (6) (4)の書式なし流れ探査WRITE文の実行直後のファイル状態を、POS指定子またはSIZE指 定子をもつINQUIRE文によって、問い合わせしている。 <プログラム例> (a)のプログラム例 REAL(8),DIMENSION(1536,1536)::R1,R2 DO J=1,1536 DO I=1,1536 R1(I,J)=DBLE(I*J) ENDDO ENDDO OPEN(10,FILE='X.DATA',ACCESS='STREAM',FORM='UNFORMATTED') WRITE(10)R1 CLOSE(10) OPEN(10,FILE='X.DATA',ACCESS='STREAM',FORM='UNFORMATTED',STATUS='OLD') DO J=1,1536 DO I=1,1536 READ(10)R2(I,J) ENDDO ENDDO IF (ALL(R1==R2).NEQV..TRUE.)THEN WRITE(*,*)'Read Error' ELSE WRITE(*,*)'Read Correct' ENDIF CLOSE(10) END (b)のプログラム例 REAL(8),DIMENSION(1024,1025)::R1,R2 DO J=1,1024 DO I=1,1025 R1(I,J)=DBLE(I*J) ENDDO ENDDO OPEN(10,FILE='X.DATA',ACCESS='STREAM',FORM='UNFORMATTED') WRITE(10,POS=1)R1 WRITE(10)1.0 CLOSE(10) OPEN(10,FILE='X.DATA',ACCESS='STREAM',FORM='UNFORMATTED',STATUS='OLD') READ(10)R2 IF (ALL(R1==R2).NEQV..TRUE.)THEN WRITE(*,*)'Write Error' ELSE WRITE(*,*)'Write Correct' ENDIF CLOSE(10) END (c)のプログラム例 REAL(8),DIMENSION(1024,1025)::R1,R2 DO J=1,1024 DO I=1,1025 R1(I,J)=DBLE(I*J) ENDDO ENDDO OPEN(10,FILE='X.DATA',ACCESS='STREAM',FORM='UNFORMATTED') WRITE(10,POS=1)R1 INQUIRE(IOLENGTH=IL)R1 INQUIRE(10,POS=IPOS,SIZE=ISIZE) IF (IPOS/=IL+1.or.ISIZE/=IL)THEN WRITE(*,*)'INQUIRE Error' ELSE WRITE(*,*)'INQUIRE Correct' ENDIF CLOSE(10) END ●回避方法 ・実行時オプション-gを指定して実行します。 読み込むデータの長さはINQUIRE文のIOLENGTH指定子で取得することができます。 『INQUIRE文のIOLENGTH指定子で取得した値/1024』(割り切れない場合は、切り 上げた値)を-gオプションで指定してください。 INQUIRE(IOLENGTH=IL)R2 OPEN(10,FILE='x.data',ACCESS='STREAM',FORM='UNFORMATTED',STATUS='OLD') DO J=1,1536 DO I=1,1536 READ(10)R2(I,J) ENDDO ENDDO プログラム実行例: $ ./a.out -Wl,-g18432 ・OPEN文からCLOSE文の間に実行されるREAD文で入力するデータの長さを入出力 バッファサイズより小さい値にしてください。 OPEN(10,FILE='X.DATA',ACCESS='STREAM',FORM='UNFORMATTED',STATUS='OLD') DO J=1,1536 DO I=1,1536 READ(10)R2(I,J) IPOS=IPOS+8 IF (IPOS>=MAXSIZE*((IPOS-8)/MAXSIZE+1))THEN CLOSE(10) OPEN(10,FILE='X.DATA',ACCESS='STREAM',FORM='UNFORMATTED',STATUS='OLD') READ(10,POS=IPOS) ENDIF ENDDO ENDDO ・ACCESS='SEQUENTIAL'とFORM='BINARY'を使用します。 OPEN(10,FILE='X.DATA',ACCESS='SEQUENTIAL',FORM='BINARY',STATUS='OLD') DO J=1,1536 DO I=1,1536 READ(10)R2(I,J) ENDDO ENDDO ●現象に該当するかどうかの確認方法 実行可能ファイルを生成するために使用しているプログラム全体に対して、以下の grep コマンドを 実行してください。 ・現象(a)の確認について 以下の手順でキーワードを検索してください。 (ア) grep -i 'STREAM' 【Fortranソースプログラム】 - "STREAM"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (イ) grep -i 'OPEN' 【Fortranソースプログラム】 - "OPEN"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (ウ) grep -i 'UNFORMATTED' 【Fortranソースプログラム】 - "UNFORMATTED"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (エ) grep -i 'READ' 【Fortranソースプログラム】 - "READ"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (ア)~(エ)がすべて検出され、かつ、以下の(1)~(3)を満たしているプログラム は、障害が発生します。 (1) OPEN文のACCESS指定子に'STREAM'およびFORM指定子に'UNFORMATTED'を指定 している(文字変数による指定または小文字の指定も同様)。 (2) 以下の条件を満たす書式なし流れ探査READ文を実行している。 (2-1) POS指定子に1以外を指定している。または、POS指定子を指定してい ない。かつ、 (2-2) 直前に実行された文が以下の文でない。 (ア) POSITION指定子に'APPEND'を指定していないOPEN文 (イ) REWIND文 (ウ) 長さ0の文字列または空配列のみを入出力並びにもつPOS指定子 に1を指定した書式なし流れ探査入出力文 (エ) (ア)~(ウ)のいずれかの文の直後に実行した長さ0の文字列 または空配列のみを入出力並びにもつPOS指定子を指定していな い書式なし流れ探査入出力文 (3) (2)の書式なし流れ探査READ文で読み込むデータに、 『入出力バッファの先頭に読み込まれたデータのファイル位置+ ( 入出力バッファサイズ×n(注) )+1』 のファイル位置に位置するデータが含まれる。 注)入出力バッファの先頭に読み込まれたデータがファイルの先頭に位置す るデータである場合はn>=2、それ以外の場合はn>=1。 備考)入出力バッファが空である場合、入出力バッファにデータが読み込ま れる。 ・現象(b)の確認について 以下の手順でキーワードを検索してください。 (ア) grep -i 'STREAM' 【Fortranソースプログラム】 - "STREAM"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (イ) grep -i 'OPEN' 【Fortranソースプログラム】 - "OPEN"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (ウ) grep -i 'UNFORMATTED' 【Fortranソースプログラム】 - "UNFORMATTED"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (エ) grep -i 'WRITE' 【Fortranソースプログラム】 - "WRITE"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (ア)~(エ)がすべて検出され、かつ、以下の(1)~(3)を満たしているプログラ ムは、障害が発生します。 (1) OPEN文のACCESS指定子に'STREAM'およびFORM指定子に'UNFORMATTED'を 指定している(文字変数による指定または小文字の指定も同様)。 (2) 以下の出力並びを持つPOS指定子を指定した書式なし流れ探査WRITE文を実 行している。 (2-1)出力並びの長さが入出力バッファ長を超えている。または、 (2-2)出力並びの長さが入出力バッファ長と同じである。かつ、 最後の出力並びが長さ0の文字列である。 (3) (2)の書式なし流れ探査WRITE文実行直後に、POS指定子を指定していない書 式なし流れ探査WRITE文を実行している。 ・現象(c)の確認について 以下の手順でキーワードを検索してください。 (ア) grep -i 'STREAM' 【Fortranソースプログラム】 - "STREAM"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (イ) grep -i 'OPEN' 【Fortranソースプログラム】 - "OPEN"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (ウ) grep -i 'UNFORMATTED' 【Fortranソースプログラム】 - "UNFORMATTED"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (エ) grep -i 'WRITE' 【Fortranソースプログラム】 - "READ"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (オ) grep -i 'INQUIRE' 【Fortranソースプログラム】 - "INQUIRE"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (カ) grep -i 'POS' 【Fortranソースプログラム】 - "POS"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (キ) grep -i 'SIZE' 【Fortranソースプログラム】 - "INQUIRE"という文字列をプログラム中に含まない場合、 障害条件には該当しません。(大文字/小文字は区別しません) (ア)~(キ)がすべて検出され、かつ、以下の(1)~(3)を満たしているプログラ ムは、障害が発生します。 (1) OPEN文のACCESS指定子に'STREAM'およびFORM指定子に'UNFORMATTED'を 指定している(文字変数による指定または小文字の指定も同様)。 (2) 以下の出力並びを持つPOS指定子を指定した書式なし流れ探査WRITE文を実 行している。 (2-1)出力並びの長さが入出力バッファ長を超えている。または、 (2-2)出力並びの長さが入出力バッファ長と同じである。かつ、 最後の出力並びが長さ0の文字列である。 (3) (2)の書式なし流れ探査WRITE文の実行直後のファイル状態を、POS指定子 またはSIZE指定子をもつNQUIRE文によって、問い合わせしている。 [問い合せ窓口] 九州大学 情報統括本部 HPC事業室 全国共同利用担当 Mail: request(at)iii.kyushu-u.ac.jp ※(at)は@に置き換え Tel : 092-802-2683