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

+--------------------------------------------------------------------------+ |1.Fortran コンパイラの実行結果異常について | | (スーパーコンピュータシステム, 高性能演算サーバシステム) | +--------------------------------------------------------------------------+ ----------------------------------------------------------------- 情報基盤研究開発センター研究用計算機システムWWWホームページ     http://www.cc.kyushu-u.ac.jp/scp/ ----------------------------------------------------------------- 1.Fortran コンパイラの実行結果異常について (スーパーコンピュータシステム, 高性能演算サーバシステム)  スーパーコンピュータシステムFX10, 高性能演算サーバシステムCX400 の Fortran コンパイラの OpenMP ライブラリにおいて,実行結果異常となる障害が見つかりました. 障害は,以下の条件をすべてみたした場合に発生するもので,富士通製の Technical Computing Suite の Fortran のみが該当します.障害は3月末に修正予定です. 心当たりのある方はセンターまで( E-mail: request(at)iii.kyushu-u.ac.jp) ご相談願います. <現象と条件> 以下の条件をすべてみたす場合,実行結果(注1)に誤りが生じる可能性があります. 1) 翻訳時オプション -Kopenmp が有効である 2) モジュールプログラムの宣言部に threadprivate 指示文が現れる 3) 2) の threadprivate 指示文に現れた変数は public 属性をもつ 4) 2) のモジュールプログラムを参照結合(USE)しているモジュールプログラムがある 5) 4) の参照結合がモジュールの宣言部に現れる 6) 5) のモジュール宣言部では 3)の変数に対して以下のいずれかで private属性を有効にしている a) プログラム内で、private属性を有効にしている b) 翻訳時オプション-Ap (注2) を有効にしている 7) 4) のモジュールプログラムのモジュール手続で 3) の変数を引用している 8) 7) の変数を OpenMP 構文内で引用している (注1) 条件8)の変数引用がスレッドごとにプライベートな変数にならなければ なりませんが,すべてのスレッドでマスタスレッドの変数が引用されるため, 意図している変数を引用することができません (注2) 翻訳時オプション -Ap は モジュールの暗黙の参照許可属性を private 属性 にします.これはモジュールに参照対象並びのない private 文を記述するのと同じ 効果をもちます.翻訳時オプション-Ap はデフォルトではありません <プログラム例> module mod01 use omp_lib integer,save :: TID ! Default is public 3) !$OMP threadprivate(TID) ! 2) contains subroutine sub01() TID=0 !$omp parallel TID=omp_get_thread_num() +1 !$omp end parallel end subroutine end module MODULE mod02 ! 4) use mod01 ! 4) , 5) save private !!!!! 6) Avoidance --- a) public :: sub02 !!!!PUBLIC :: TID !!!!! Avoidance --- b) contains subroutine sub02 integer,save::id !$omp threadprivate(id) !$OMP PARALLEL id=omp_get_thread_num() + 1 if (id/=TID) print *,'NG :', id ,TID !!!! 7) , 8) !$OMP END PARALLEL end subroutine end module program main use mod02 use mod01 call sub01() call sub02() print *,'PH00939 : pass' end program 実行結果: NG : 2 1 PH00939 : pass 注意)実行環境のスレッド数により 'NG'の表示の数が変動します <回避方法> 1) オプションによる回避 翻訳時オプション-Ap を有効にしている場合,翻訳時オプション -Ap を無効に してください.-Ap を有効にしていない場合,オプションによる回避はできません. 2) ソース修正による回避 条件 6) の private 属性を無効にし public 属性を有効にしてください. 修正として以下の方法があります. a)サンプルプログラムの a) の private 文を注釈にする b)サンプルプログラムの b) の public 文を有効にする