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

+--------------------------------------------------------------------------+ |1.C, C++ の実行結果異常について                     | | (スーパーコンピュータシステム, 高性能演算サーバシステム)       | +--------------------------------------------------------------------------+ ----------------------------------------------------------------- 情報基盤研究開発センター研究用計算機システムWWWホームページ     http://www.cc.kyushu-u.ac.jp/scp/ ----------------------------------------------------------------- 1.C, C++ の実行結果異常について (スーパーコンピュータシステム, 高性能演算サーバシステム) スーパーコンピュータシステムFX10, 高性能演算サーバシステムCX400 の C, C++言語に実行結果異常となる障害が2件見つかりました.障害は Technical Computing Suite のみが該当し,修正時期は未定です. 心当たりのある方はセンター( E-mail: request(a)iii.kyushu-u.ac.jp) まで ご相談願います. ●障害1 (番号 PH02459) <現象と条件> 以下の条件をすべてみたすとき,実行時異常終了または実行結果に誤りが生じる 場合があります. 1) 1-1) または 1-2) の翻訳時オプションが有効である. 1-1) 以下の翻訳時オプションがすべて有効である. - -O2以上 (*1) - -Kloop_fission (*2) - -Kloop_interchange (*2) - -Kunroll (*2) - -Kparallel 1-2) 以下の翻訳時オプションがすべて有効である. - -O3(*1) - -Kloop_fission (*2) - -Kloop_interchange (*2) - -Kunroll (*2) 2) ソースプログラムに多重ループが存在する. 3) 2) のループの回転数が翻訳時に不明である. 4) 2) の外側ループと内側ループの間に変数への代入文が存在する. 5) 2) の内側ループには配列を引用する実行文を含む if ブロックだけが存在する. 6) 4) の変数は 5) の if 文の条件式またはブロック内の実行文で参照されている. 7) 5) の配列の添字に 2) のいずれかのループ制御変数が存在する. 8) 8-1) または 8-2) の条件に該当する. 8-1) 7) の配列の添字の外側ループの制御変数の出現数と内側ループの制御変数 の出現数が異なる. 8-2) 7)の配列は多次元配列である.かつ,その配列への代入文が存在する. かつ,その配列の1次元目の添字に外側ループのループ制御変数が存在する. 9) 4) の変数はポインタ型または構造体要素でない. 10) 2) の多重ループはコンパイラの最適化によってループ分割される(*3). 11) 2) の多重ループはコンパイラの最適化によってループ交換される(*4). 12) 2) の内側ループはコンパイラの最適化によってループアンローリングされる(*5). *1: 翻訳時オプション -Kfast で -O3 が誘導されます. *2: 翻訳時オプション -O2 以上で誘導されます. *3: ループ分割が適用された場合,該当ループに対して最適化メッセージ jwd8212o-i が出力されます. *4: ループ交換が適用された場合,該当ループに対して最適化メッセージ jwd8211o-iが出力されます. *5: ループアンローリングが適用された場合,該当ループに対して最適化 メッセージ jwd8202o-i または jwd8203o-i が出力されます. <プログラム例> [例1] void func(int max) { int n,m,ii; int mask[11]; double d1[11], d2[11]; ... for (m=1; m<=max; m++) { /* 2),3) */ ii=m; /* 4),9) */ for (n=1; n<=max; n++) { /* 2),3) */ if(ii==mask[n]){ /* 6),7),8-1) */ d1[n] = d2[m]; /* 5),7),8-1) */ } } } ... } [例2] void func(int max) { int n,m,ii; int mask[11]={1,0,1,0,1,0}; double d1[11][11], d3[11]; ... for (m=1; m<=max; m++) { /* 2),3) */ ii=m; /* 4),9) */ for (n=1; n<=max; n++) { /* 2),3) */ if(ii==mask[n]){ /* 6),7) */ d1[n][m] = d3[n]; /* 5),7),8-2) */ } } } ... } <回避方法> 以下の何れかの方法で障害を回避することができます. 1) 翻訳時オプション -O0 または -O1 を指定する. 2) 翻訳時オプション -Kloop_nofission を指定する. ●障害2 (番号 PH02461) <現象と条件> 以下の条件を全て満たした場合、実行結果に誤りが生じることがあります. 1) 翻訳時オプション -O2 以上が有効である. 2) ソースプログラム中に while文, do文, または goto文によるループを記述して いる. 3) 2) のループの終了条件は変数と式を比較している. 4) 3) の変数は整数型である. 5) 3) の式は定数または 2)のループで不変である. 6) 3) の変数はループ中で一定の値を加算または減算している. 7) 3) の変数の代入文が 2)のループの先頭と同一の行,または1つ前の行に存在する. 8) 7) の代入と 2)のループの間で 3)の変数を参照している. <プログラム例> void f1(int nn){ int ii = nn; /* 4), 7) */ if(ii <= 100) { do /* 2), 8) */ { ii -= 100; } /* 6) */ while(ii > 100); /* 3), 5) */ } } 例では3行目のiiが不定の値となります.その影響で実行結果に誤りが 生じることがあります. <回避方法> 以下の何れかの方法で障害を回避することができます. 1) 翻訳時オプション -O0 または -O1 を指定する. 2) 条件7) の変数の代入文とループを1行以上あける. プログラム例では2行目と3行目の間に空行を入れてください. [問い合せ窓口] 九州大学 情報統括本部 HPC事業室 全国共同利用担当 Mail: request(a)iii.kyushu-u.ac.jp Tel : 092-642-2308