九州大学 情報基盤研究開発センター 研究用計算機システムニュース   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