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

+--------------------------------------------------------------------------+ |1.富士通Fortran/C/C++コンパイラの実行結果異常について | | (スーパーコンピュータシステム, 高性能演算サーバシステム) | +--------------------------------------------------------------------------+ ----------------------------------------------------------------- 情報基盤研究開発センター研究用計算機システムWWWホームページ     http://www.cc.kyushu-u.ac.jp/scp/ ----------------------------------------------------------------- 1.富士通Fortran/C/C++コンパイラの実行結果異常について (スーパーコンピュータシステム, 高性能演算サーバシステム) スーパーコンピュータシステムFX10, 高性能演算サーバシステムCX400 の Fortran, C, C++ コンパイラにおいて,実行結果異常となる障害が3件見つかりました.障害は以下 の条件をすべて満たした場合に発生するもので,富士通製の Technical Computing Suite の Fortran(障害3のみ), C, C++ のみが該当します.障害修正時期は未定です. 心当たりのある方はセンターまで( E-mail: request(at)iii.kyushu-u.ac.jp) ご相談ください. ============================================================================== 障害1【番号: PH04155】C/C++ ●現象と条件 以下の条件をすべて満たした場合,実行結果に誤りが生じることがあります. (1) 翻訳時オプション -Kparallel が有効である. (2) 翻訳時オプション -Kloop_part_parallel が有効である.または, 最適化指示子 loop_part_parallel が有効である. (3) while ループ,do-while ループ,または if-goto ループが存在する. (4) (3)のループの終了条件は,以下の (4.1)~(4.4) に該当する. (4.1) (3)のループの終了条件は,変数と式を比較している. (4.2) (4.1)の変数は整数型である. (4.3) (4.1)の式は定数または,(3)のループで不変である. (4.4) (4.1)の変数はループ中で一定の値を加算または減算している. (5) (3)のループ制御変数(*1)の初期値は,(3)のループの直前で代入されている. (6) (5)の文の直前に,ループまたは if 文が存在する. (7) (5)のループ制御変数は,(3)のループの終了後に参照される. (8) (3)のループ中に,自動並列化が可能な文が存在する.(ループの回転を跨いだ データ依存がない) (9) (3)のループ中に,自動並列化が不可能な文が存在する.(ループの回転を跨いだ データ依存がある場合など) (10) (3)のループはコンパイラの最適化によって部分的に並列化される.(*2) *1:(4) の条件に該当する変数 *2:部分並列化が適用された場合,該当ループに対して翻訳時メッセージ jwd5005p-i または jwd5016p-i が出力される. <プログラム例> if (x == 0) { } /* 条件(6) */ i=1; /* 条件(5) */ /* ループA */ while(i<100) { /* 条件(3),(10) */ a[i] = a[i]+1; /* 条件(8) */ b[i] = b[i-1]+1; /* 条件(9) */ i++; } printf("%d\n",i); /* 条件(7) */ ●回避方法 以下のいずれかの方法で回避できます. a) 翻訳時オプション -Kloop_nopart_parallel を指定する. b) 翻訳時オプション -Kocl を指定し,かつソースプログラムの対象ループ (ループA)に最適化指示子 loop_nopart_parallel を追記する. ============================================================================== 障害2【番号: PH04411】C/C++ ●現象と条件 以下の条件をすべて満たした場合,実行結果に誤りが生じることがあります. (1) 以下の翻訳時オプションが全て有効である. - -O2 以上 (*1) - -Krdconv (*1) - -Klib (*1) - -Kunroll (*1,*2) (2) ソースプログラムにループが存在する. (3) (2)のループ制御変数が long型または unsigned long型で宣言されている. (4) (2)のループ中に char型または unsigned char型の配列に対するメモリアク セスが存在する. (5) (4)の配列アクセスは(3)のループ制御変数に依存している. (6) (2)のループ中に memcpy関数を使用している. (7) memcpy関数の第3引数に,(5)と同一のループ制御変数を指定している. *1: 翻訳時オプション -Kfast で誘導されます. *2: 翻訳時オプション -O2 以上で誘導されます. <プログラム例> void foo(char *x, char *y, char *z, int n) { long i; /* 条件(3) */ /* ループA */ for (i=0; i