0

Quadro K2000M カード、CUDA 機能 3.0、CUDA ドライバー 5.5、ランタイム 5.0、Visual Studio 2010 でのプログラミングを使用しています。私の GPU アルゴリズムは、ツリー (定数) の多数の並列幅優先検索 (BFS) を実行します。スレッドは、定数配列とツリーからの読み取りを除いて独立しています。各スレッドには、キューを使用した BFS アルゴリズム (再帰なし) に従って、いくつかの malloc/free 操作が存在する可能性があります。N 個のスレッドがあります。ツリー リーフ ノードの数も N です。ブロックあたり 256 スレッド、グリッドあたり (N+256-1)/256 ブロックを使用しました。

問題は、プログラムが N=100000 未満のスレッドでは機能するが、それ以上のスレッドでは失敗することです。また、CPU または GPU スレッドごとに動作します。N が大きい場合 (例: >100000)、カーネルがクラッシュし、cudaMemcpyデバイスからホストへの接続も失敗します。Nsight を試しましたが、遅すぎます。

ここcudaDeviceSetLimit(cudaLimitMallocHeapSize, 268435456);で、最大 1G までのより大きな値も試しました。cudaDeviceSetLimit成功しましたが、問題は残ります。

上記の問題の一般的な理由を知っている人はいますか? または、さらにデバッグするためのヒントはありますか? いくつかのprintfを入れようとしましたが、大量の出力があります。さらに、スレッドがクラッシュすると、残りのすべての printf が破棄されます。したがって、問題を特定するのは困難です。

4

1 に答える 1

1

「CUDA ドライバー 5.5、ランタイム 5.0」 -- 奇妙に思えます。

Windows TDR イベントが発生している可能性があります。あなたの説明に基づいて、私は最初にそれを確認します。スレッドを増やしていくと、カーネルの実行に約 2 秒以上かかるようになると、Windows のタイムアウトに達する可能性があります。

また、すべてのカーネル呼び出しと CUDA API 呼び出しに対して、適切なcuda エラー チェックをコードに追加する必要があります。Windows TDR イベントは、受け取ったエラー コードに基づいてより簡単に明らかになります。または、エラー コードによって別の方向に進む可能性があります。

最後にcuda-memcheck、合格と不合格の両方のケースでコードを実行し、カーネル内の範囲外アクセスやその他の問題を探します。

于 2013-08-09T23:35:07.880 に答える