Unified Parallel C(UPC)は、大規模な並列マシンでの高性能コンピューティング用に設計されたC言語拡張です。 この言語は、共有メモリと共有メモリを備えたシステムの単一のプログラミングモデルを表します。 並列処理の量は、プログラムの開始時に固定され、通常はプロセッサコアごとに1つのスレッドが使用されます。
» UPCの公式ウェブサイト
» バークレーUPC公式ウェブサイト
前回の記事で、 WindowsおよびLinuxへのインストールでは、UPCインストールの実行方法について説明しましたが、デバッグの使用に関する重要な問題は未解決のままです。 メモリがどこかに間違って割り当てられたり、配列が大きすぎると、プログラムが非常に頻繁にクラッシュします
***致命的な信号をキャッチ:ノード0/1のSIGSEGV(11)
注意:バグを報告する前に、環境でGASNET_BACKTRACE = 1で実行して、バックトレースを生成してください。
セグメンテーションエラー(撮影されたキャスト)
この状況で検索を絞り込むために何ができますか? これについては、現在の記事で説明しています。
長い間、私はデバッグについて学ぶことを避けていました。 すでにプログラミングを行う必要がありました。 デバッグする代わりに、各スレッドのアクションのprintfを使用して十分な詳細を記録しました。 ただし、UPCプログラムがCに変換され、一般的なケースでは解釈されないという事実によって、問題は影になります。 ある行が(ログによって)正常に実行され、次のログが発生しなかった場合、ログに記録された行の間にエラーがあるという事実ではありません! 非常に多くの場合、「将来」のエラーは現在の状況に影響し、プログラムをまったく別の場所でクラッシュさせます。
すべてが英語で正常に機能している場合、完全なデバッグ情報はDebugging Berkeley UPC applicationsの公式ページにあります 。
大学のドメインにメールボックスがある場合は、推奨されるTotalViewの学生ライセンスをリクエストできます。そうでない場合は、通常のデバッガーCを使用できます。
Cに変換した後、main()関数はuser_main()に変わることに注意してください。
まず、特別なデバッグモードを使用するには、
-g
オプションを指定してupccを実行する必要があります。 これは、特別なUPC構成がdbgサブフォルダーから開始されることを意味します。 特定のコード行を表示できるようにするには、コンパイル時に
-save-temps
パラメーターを使用して一時ファイルをソースとともに保存する必要があります。
upcc ./Pack_Polycubes.upc -o Pack_Polycubes -pthreads <b>-save-temps -g</b>
いくつかのデバッグエントリポイントがあります。
-freeze[=<thread_id>]
パラメーターを使用して特定の番号のスレッドを停止するか、または
-freeze-on-error
して誤って単純に停止することができ
-freeze-on-error
。
upcrun -n 1 -freeze-on-error ./Pack_Polycubes
-警告警告警告警告警告警告警告
このアプリケーションは、Berkeley UPCインストールから構築されました。
これらのオプション機能を有効にして構成および構築されました。
デバッグトレース統計コレクションデバッグmalloc
通常、これはパフォーマンスに重大な影響を与えるため、
このプログラムの実行で報告されたパフォーマンス値を信頼してください!!!
このメッセージを抑制するには、「-quiet」をupcrunコマンドに渡すか、設定します
UPC_NO_WARNまたはUPC_QUIET環境変数。
-UPCR:Rosa-VBのUPCスレッド0 of 1(pshmノード0 of 1、プロセス0 of 1、pid = 31257)
こんにちは、私は1 of 0です。
...
***致命的な信号をキャッチ:ノード0/1のSIGSEGV(11)
デバッガー用に凍結されたプロセス:ホスト= Rosa-VB pid = 31257
凍結を解除するには、デバッガを接続して「gasnet_frozen」を0に設定するか、SIGCONTを送信します
次に、出力コンパイルファイルがあるフォルダーから別のコンソールセッションでgdbを実行し、ストリームのPIDを指定する必要があります。
gdb Pack_Polycubes.o 31257
GNU gdb(リナロGDB)7.7.1_2014.06_1-10()
著作権©2014 Free Software Foundation、Inc.
...
/lib64/ld-linux-x86-64.so.2のロードされたシンボル
/lib64/libc.so.6からの__nanosleep_nocancel()の0x00007f0afab16cd0
プログラムを続行するには、次のコードを実行する必要があります。
(gdb) set gasnet_frozen = 0 (gdb) continue
プログラムは、有用なエラーのある行を報告します。
プログラムは信号SIGSEGV、セグメンテーション障害を受信しました。
MultiplyMatrixPackSpaceの0x00000000004289f8(結果= 0x26274ac、マトリックス= 0x2696340、CurPackSpace = 0x7ffd81634020)
./Pack_Polycubes.upc:1065で
1065結果[行] [列] = 0;
現在のブレークポイントをより詳細に表示するには、次のコマンドを使用できます。
(gdb) list
1060 //「列ごとの行」ルールによる乗算
1061 for(row = 0; row <Params.Demension; row ++)
1062 {
1063 for(col = 0; col <Params.Demension; col ++)
1064 {
1065結果[行] [列] = 0;
誰が考えたでしょう。 インデックスと割り当てられたメモリを扱います))コールスタックを確認するには、btコマンドを使用します
(gdb) bt
#0 0x00000000004289f8 in MultiplyMatrixPackSpace(結果= 0x26274ac、マトリックス= 0x2696340、CurPackSpace = 0x7ffd81634020)
#1 0x0000000000428680 in CheckIndependancePS(CurPackSpace = 0x7ffd81634020)at ./Pack_Polycubes.upc:1032
#2 0x0000000000428430 AddIndependentPackSpace(CurPackSpace = 0x7ffd81634020)in ./Pack_Polycubes.upc:1011
...
#8 0x0000000000427e21 ExplorePackSpaces()at ./Pack_Polycubes.upc:922
#9 0x00000000004244c5 in user_main(argc = 4、argv = 0x7ffd816344e8)at ./Pack_Polycubes.upc:214 ...
呼び出しスタックは下から見る必要があります。 ユーザープログラムはuser_mainで始まり、呼び出しは順番に行われ、エラーが発生した場所とパラメーターを明確にします。
デバッグを正しく終了するには、さらに続行する必要があります。その後、
quit
を実行できます。
(gdb) continue
続く
シグナルSIGSEGV、セグメンテーションエラーでプログラムが終了しました。
プログラムはもう存在しません。
何らかの理由でデバッグプロセスがスタックしている場合、別のコンソールウィンドウから
kill
コマンドを使用してそれらを強制終了できますが、RosaではCtrl ^ Cを使用すると簡単になります。
最もリクエストされたgdbコマンド:
break [file:]functiop
関数にbreak [file:]functiop
を設定しbreak [file:]functiop
bt
呼び出しスタック
print expr
式の値を出力します
プログラムの実行を続ける
next
プログラムの次の行を実行します(ジャンプ)
step
プログラム行内をステップ
list-現在のブレークポイントを表示
help
-help
を求める
quit
-終了
そしていつものように、
man gdb
ご清聴ありがとうございました! 誰かが役に立つといいな