並列領域で実行が停止されると、 where コマンドによってアウトラインサブルーチンを含むスタックトレースと複数の実行時ライブラリ呼び出しが表示されます。 「コンパイラによる OpenMP コードの変換」の Fortran の例を使用して実行を行 15 で停止すると、where コマンドによって次のスタックトレースが生成されます。
[t@4 l@4]: where 現スレッド: t@4 =>[1] _$d1A12.MAIN_(), 行番号 15 "example.f90" [2] __mt_run_my_job_(0x45720, 0xff82ee48, 0x0, 0xff82ee58, 0x0, 0x0), at 0x16860 [3] __mt_SlaveFunction_(0x45720, 0x0, 0xff82ee48, 0x0, 0x455e0, 0x1), at 0x1aaf0 |
スタックの上位フレームはアウトライン関数のフレームです。コードがアウトラインされていても、ソース行番号は 15 にマップされたままです。ほかの 2 つのフレームは実行時ライブラリルーチン用です。
並列領域で実行が停止されると、前述の例のようにスレーブスレッドの where コマンドはスタックトレースを親スレッドに戻しません。ただし、マスタースレッドの where コマンドは完全トレースバックを行います。
[t@4 l@4]: thread t@1 t@1 (l@1) で停止しました _$d1A12.MAIN_ 行番号 15 ファイル "example.f90" 15 sum = sum + a(i) [t@1 l@1]: where 現スレッド: t@1 =>[1] _$d1A12.MAIN_(), 行番号 15 "example.f90" [2] __mt_run_my_job_(0x41568, 0xff82ee48, 0x0, 0xff82ee58, 0x0, 0x0), at 0x16860 [3] __mt_MasterFunction_(0x1, 0x0, 0x6, 0x0, 0x0, 0x40d78), at 0x16150 [4] MAIN(), 行番号 12 "example.f90" |
いくつかのスレッドが大きくない場合、threads コマンド (「threads コマンド」参照) を使用してすべてのスレッドをリスト表示し、スレーブスレッド内で実行がどのようにブレークポイントに到達したかを判別し、各スレッドに切り替えてマスタースレッドを判別することができます。