4

多数のブロック/スレッドに対して非常に確実にハングする、かなり大きくて複雑な CUDA コードがあります。コードがハングする場所を正確に把握しようとしています。

でコードを実行するとcuda-gdb、どのスレッド/ブロックがハングしているかがわかりますが、「仮想 PC」以外の場所はわかりません。

デバッグ情報を取得するために「-G」を指定してコードをコンパイルすると、実行時間が大幅に遅くなり、長時間実行してもハングしなくなります。

「仮想PC」をソースコードのコード行にマッピングする方法はありますか? または、すべての最適化をオフにせずにデバッグ情報を取得する方法はありますか?

「-G3」を使用してみましたが、役に立ちませんでした。これは、タイプ " " の警告を表示するだけですnvcc warning : Setting optimization level to 0 as optimized debugging is not supported。CUDA コンパイル ツール リリース 4.1 を使用しています。

4

1 に答える 1

9

わかりました、私は自分でそれを理解したと思います。

cuobjdumpがパスにある場合cuda-gdb、コマンドx $pcは、現在のスレッドが停止しているアセンブラを示します。問題は、ソースが でコンパイルされていない場合-G、アセンブラー ステートメントをコード内の行に関連付けることができないことです。

アセンブラをカーネル コードに一致させるには、まず、カーネルを .xml でコンパイルしたことを確認してくださいnvcc -keep [..] mykernel.cu。これにより、ファイルmykernel.sm_20.cubin(または選択したアーチ) とmykernel.ptx.

カーネル全体のアセンブラを取得するには、cuobjdump -sass mykernel.cubin > output.ptx. ではcuda-gdbx/20i $pc-80コンテキストを少し取得するために実行し、ファイル内のそれらの行を探しますoutput.ptx。次に、それらの行を、ソース内の行を参照するステートメントをmykernel.ptx含むPTX コードと一致させることができます。.loc

このアプローチでは、cubin-file の PTX と の PTX を一致させるために少し創造性が必要です。これはnvcc、命令の順序が多少変更される可能性があるためです。私のコードには、FFMA方向性を知るために探すことができる命令の大きなブロックがありました。「output.ptx」を使用してデバッガーから正確な行を見つけ、同じ相対位置で「mykernel.ptx」を調べることができます。

これにはかなりの作業が必要ですが、元のソースでの「仮想 PC」の場所を絞り込むことができます。

于 2012-05-15T17:15:48.380 に答える