1.富士通 C, C++ コンパイラ(OpenMP)の実行結果異常について
(スーパーコンピュータシステム, 高性能演算サーバシステム)
九州大学 情報基盤研究開発センター 研究用計算機システムニュース No.353
2015.06.01
+--------------------------------------------------------------------------+
|1.富士通 C, C++ コンパイラ(OpenMP)の実行結果異常について |
|(スーパーコンピュータシステム, 高性能演算サーバシステム) |
+--------------------------------------------------------------------------+
-----------------------------------------------------------------
情報基盤研究開発センター研究用計算機システムWWWホームページ
http://www.cc.kyushu-u.ac.jp/scp/
-----------------------------------------------------------------
1.富士通 C, C++ コンパイラ(OpenMP)の実行結果異常について
(スーパーコンピュータシステム, 高性能演算サーバシステム)
スーパーコンピュータシステムFX10, 高性能演算サーバシステムCX400 の
C/C++コンパイラにおいて OpenMP による並列化を行った場合に,実行結果異常
となる障害が見つかりました.
障害は以下の条件をすべて満たした場合に発生するもので,富士通製の Technical
Computing Suite のみが該当します.また,Fortran では発生しません.
障害修正時期は未定です.心当たりのある方はセンター
E-mail: request(at)iii.kyushu-u.ac.jp
までご相談ください.
===========================================================================
【障害番号 PH06276】
●現象と条件
以下の条件のとき,実行結果が正しくない場合がある(*).
1) 翻訳時オプション -Kopenmp が有効である.
2) OpenMP の threadprivate 指示文が存在する.
3) 2) の指示文が存在する翻訳単位内に,threadprivate 以外の OpenMP指示文を
含む関数が存在しない.
4) 2) の指示文のリストに指定された変数が,2) の翻訳単位内で参照される.
*) 障害は,条件2)の threadprivate 指示文が有効にならないことが原因です.
このため,threadprivate 指示文のリストに指定した変数が,スレッドプライ
ベートな変数として扱わず,元の変数がすべてのスレッドで共有されます.
<プログラム例1>
#include
int tp = 0;
#pragma omp threadprivate(tp) /* 2) */
void func(void) { /* 3) */
tp += 1; /* 4) */
if (tp != 1) printf("ng\n"); /* 4) */
}
<プログラム例2>
extern void func(void);
int main() {
#pragma omp parallel
{
func();
}
return 0;
}
<回避方法>
GNU C拡張仕様のスレッド・ローカル・ストレージ(__thread指定子)を使って
対象変数を宣言し,翻訳時オプション -Xg を有効にすることで障害を回避できます.
(-Xg が無効の場合 __thread がエラーになります.)
・修正前
int tp = 0;
#pragma omp threadprivate(tp)
・修正後
__thread int tp = 0;
/* #pragma omp threadprivate(tp) */
<チェックコンパイラ>
お手持ちのコードが障害(PH06276)に該当するかどうかを検証するチェックコンパイ
ラが提供されています.利用方法はこちらのリンクを参照してください.
[問い合せ窓口]
九州大学 情報統括本部 HPC事業室 全国共同利用担当
Mail: request(at)iii.kyushu-u.ac.jp
Tel : 092-642-2308