2.SSL II ライブラリの実行結果異常について
3.C/C++ 言語の実行結果異常について
九州大学 情報基盤研究開発センター 研究用計算機システムニュース No.295
2013.07.19
+--------------------------------------------------------------------------+
|1.SSL II ライブラリの実行結果異常について |
|2.C/C++ 言語の実行結果異常について |
+--------------------------------------------------------------------------+
-----------------------------------------------------------------
情報基盤研究開発センター研究用計算機システムWWWホームページ
http://www.cc.kyushu-u.ac.jp/scp/
-----------------------------------------------------------------
1.SSL II ライブラリの実行結果異常について
(スーパーコンピュータシステム, 高性能演算サーバシステム)
スーパーコンピュータシステムFX10, 高性能演算サーバシステムCX400 の SSL II
ライブラリの3次元フーリエ変換サブルーチンにおいて,実行結果異常となる障害
が見つかりました.障害の発生条件については
http://www.cc.kyushu-u.ac.jp/scp/trouble/2013-06-24-detail.txt
を参照してください.障害は6月末の定期保守にて修正済です.心当たりのある方は
センターまで( E-mail: request@iii.kyushu-u.ac.jp)ご相談願います.
------------------------------------------------------------
http://www.cc.kyushu-u.ac.jp/scp/trouble/2013-06-24-detail.txt
------------------------------------------------------------
2.C/C++ 言語の実行結果異常について(1)
(スーパーコンピュータシステム, 高性能演算サーバシステム)
スーパーコンピュータシステムFX10, 高性能演算サーバシステムCX400 の C, C++
言語において,実行結果異常となる障害が2件見つかりました.障害は,以下の条件
を全て満たした場合に発生するもので,富士通製の Technical Computing Suite
の C, C++ のみが該当します.障害は9月末に修正予定です.心当たりのある方はセ
ンターまで( E-mail: request@iii.kyushu-u.ac.jp)ご相談願います.
【障害1】
<現象と条件>
以下の条件を全て満たした場合,実行結果に誤りが生じる場合があります.
1) 翻訳時オプション-Keval(*1)が有効である.
2) 翻訳時オプション-Nquickdbg=subchk(*2)が有効である.
3) 後置++または後置--演算子が記述されている.
4) 3)の後に配列型変数に対する以下のいずれかの演算が記述されている.
4-1) 配列添字演算子
4-2) ポインタ間接参照演算子が適用されたポインタ加算演算
5) 3)と4)が一つの副作用完了点から次の副作用完了点までの式中にある.
6) 4)に記述されている添字式または加算値式では副作用が発生しない.
(*1) -Kfast オプションと -Kparallel_strong オプションから誘導されます.
(*2) -Nquickdbg オプションから誘導されます.
<プログラム例>
#include
int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int main()
{
int j = 3;
int i = 7;
int r;
r = j++ + array[i];
/* j++ が発生条件3)に該当 */
/* array[i] が発生条件4)に該当 */
/* r の前と ; の前に副作用完了点があることが発生条件5)に該当 */
/* [i] が発生条件6)に該当 */
if (r == 10 && j == 4) {
printf("OK\n");
} else {
printf("NG\n"); /* j が加算されず変更されない */
}
return 0;
}
<回避方法>
以下のいずれかの方法で回避できます.
-Knoeval オプションをオプション列の最後に指定する.
-Nquickdbg=nosubchk オプションをオプション列の最後に指定する.
【障害2】
<現象と条件>
以下の条件1または2を全て満たしたとき,実行結果に誤りが生じる場合があります.
[条件1]
1) 翻訳時オプション -Kopenmp および -Xg が有効である.
2) OpenMP の parallel, for, sections, single, または task構 文が存在する.
3) 2) の OpenMP 構文内に,インラインアセンブラ (asm文)が存在する.
4) 3) の asm文のオペランドに変数が現れる.
5) 次のいずれかを満たす.
5-1) 4) の変数は 2) の OpenMP 構文の構造化ブロック内で宣言された auto 変数
である.
5-2) 4) の変数は 2) の OpenMP 構文またはその親構文の private, firstprivate,
lastprivate または reduction 指示節に現れる.
[条件2]
1) 翻訳時オプション -Kopenmp, -Xg, -O1 以上(*) および -x (*) が有効である.
2) OpenMP の parallel, for, sections, single, または task 構文が存在する.
3) 2) の OpenMP 構文内に,関数呼出しが存在する.
4) 3) の関数呼出しはインライン展開される.
5) 4) のインライン展開された関数内に,インラインアセンブラ(asm文)が存在する.
6) 5) の asm文のオペランドに,5)の関数内で宣言されたauto変数または仮引数が
現れる.
*) 翻訳時オプション -Kfast から -O3 および -x オプションが誘導されます.
<プログラム例>
[条件1のプログラム例:]
#include
int main() {
#pragma omp parallel /* 2) */
{
int x=0; /* 5-1) */
#ifdef __sparc
__asm__ ("mov 1,%0" : "=r" (x) ); /* 3),4),5-1) */
#endif
#ifdef __x86_64
__asm__ ("movl $1,%0" : "=r" (x) ); /* 3),4),5-1) */
#endif
if (x != 1) printf("ng\n");
}
printf("pass\n");
return 0;
}
<回避方法>
以下のいずれかの方法で回避できる場合があります.
・asm文のオペランドに指定している変数を "static __thread" で宣言する.
・翻訳時オプション -x0 を指定しインライン展開を抑止する.