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 が破棄されます。したがって、問題を特定するのは困難です。