このトピックは、Co-Array アプリケーションをデバッグするための手順を説明します。
以下の手順には、プログラムのすべてのイメージで共有される共有変数または Co-Array を含むアプリケーションが必要です。
Co-Array アプリケーションをデバッグするには、次の手順に従います。
- デバッグするコードの前にストールループを追加します。
LOGICAL VOLATILE :: WAIT_FOR_DEBUGGER
LOGICAL, VOLATILE :: TICK
:
DO WHILE(WAIT_FOR_DEBUGGER)
TICK = .NOT. TICK
END DO
! デバッグするコードをここに追加します
VOLATILE を使用することで、ループがコンパイラーによって削除されないことが保証されます。問題が 1 つのイメージでのみ見つかった場合は、IF (THIS_IMAGE() .EQ. 4) THEN のようにループをラップします。
- デバッグを有効にして (-g) コンパイルおよびリンクします。
- アプリケーションを実行するマシンに少なくとも N + 1 (N はアプリケーションのイメージ数) のターミナルウィンドウを作成します。
- ターミナルウィンドウでアプリケーションを開始します。
linuxprompt> ./my_app
- その他のターミナルウィンドウで、デフォルトのディレクトリーがアプリケーションの実行ファイルの場所と同じになるように設定します。1 つのウィンドウで "ps" コマンドを使用してプログラムを実行しているプロセスを調べます。
linuxprompt> ps –ef | grep 'whoami' | grep my_app
複数のプロセスが表示されます。最も古いプロセスがステップ 4 で開始したプロセスです。このプロセスは MPI ランチャーを起動して他のプロセスが終了するのを待機しています。このプロセスをデバッグしないでください。他のプロセスは以下のようになります。<ユーザー名> 25653 25650 98 15:06 ? 00:00:49 my_app
<ユーザー名> 25654 25651 97 15:06 ? 00:00:48 my_app
<ユーザー名> 25655 25649 98 15:06 ? 00:00:49 my_app
最初の番号はプロセスの PID です (例えば、最初の行の 25653)。下記のステップで、これらの N プロセスの PID は、P1、P2、... として参照されます。コマンドを入力するとき、テキスト <P1> にはプロセス 1 の PID を指定します。以下も同様です。
- 各ウィンドウで (最初のウィンドウを除く) デバッガーを開始し、アタッチしたときにプロセスを停止するように設定します。
linuxprompt> gdb
- プロセスにアタッチします。例えば、ウィンドウ 1 では P1、ウィンドウ 2 では P2、... にアタッチします。
(gdb) attach <P1>
- ストールループを抜けます。
(gdb) set WAIT_FOR_DEBUGGER = .false.
これで Co-Array アプリケーションをデバッグする準備が完了しました。
さまざまなイメージのデータとコードパスを検証することで、Co-Array アプリケーションをデバッグする準備が完了しました。