0

小さなアニメーションを描画し、glut と cuda を使用し、C++ で記述されている私のプログラムは、しばらくするとハングします。ハングしてから数秒後に中断すると、デバッガーに次のトレースが表示されます。

Program received signal SIGINT, Interrupt.
0x000000011302a84c in cuGraphicsGLRegisterBuffer ()
(gdb) bt
#0  0x000000011302a84c in cuGraphicsGLRegisterBuffer ()
#1  0x000000011306bc36 in cuGraphicsGLRegisterBuffer ()
#2  0x0000000113039455 in cuGraphicsGLRegisterBuffer ()
#3  0x0000000113006864 in cuGraphicsGLRegisterBuffer ()
#4  0x000000011303cbe6 in cuGraphicsGLRegisterBuffer ()
#5  0x000000011303d972 in cuGraphicsGLRegisterBuffer ()
#6  0x0000000113028bc6 in cuGraphicsGLRegisterBuffer ()
#7  0x000000011302a090 in cuGraphicsGLRegisterBuffer ()
#8  0x000000011301fcb2 in cuGraphicsGLRegisterBuffer ()
#9  0x0000000112ffcead in cuGraphicsGLRegisterBuffer ()
#10 0x0000000113001718 in cuGraphicsGLRegisterBuffer ()
#11 0x0000000112ff27cf in cuMemcpyDtoH_v2 ()
#12 0x00000001001d70c4 in cudaGetExportTable ()
#13 0x00000001002098a5 in cudaMemcpy ()

(これはスタック トレースの先頭です。残りは私自身の関数であり、そのうちの 1 つは cudaMemcpy を呼び出します。)

ハングした直後に中断しようとすると、トレースは次のようになります。

#0  0x00007fffffe0026d in __spin_lock ()
#1  0x00007fff880f855b in pthread_mutex_unlock ()
#2  0x000000011303ad89 in cuGraphicsGLRegisterBuffer ()
#3  0x000000011303b972 in cuGraphicsGLRegisterBuffer ()
#4  0x0000000113026bc6 in cuGraphicsGLRegisterBuffer ()
#5  0x0000000113028090 in cuGraphicsGLRegisterBuffer ()
#6  0x000000011301dcb2 in cuGraphicsGLRegisterBuffer ()
#7  0x0000000112ffaead in cuGraphicsGLRegisterBuffer ()
#8  0x0000000112fff718 in cuGraphicsGLRegisterBuffer ()
#9  0x0000000112ff07cf in cuMemcpyDtoH_v2 ()
#10 0x00000001001d70c4 in cudaGetExportTable ()
#11 0x00000001002098a5 in cudaMemcpy ()

これにアプローチする方法がわかりません。cudaPeekAtLastErrorへの呼び出しの前にエラーは発生しませんcudaMemcpy。また、nvidia の SDK に含まれるプログラムを実行できることも知っています。さらに、プログラムはハングする前に数秒間実行されます。これは、cudaMemcpyハングする前のすべての呼び出しがエラーを生成せずに実行されることを意味しcudaMemcpyます。だったら、cuda はハングするのではなく、エラーを生成するだけだと思います)。

カードは GeForce 9400M、Cuda ドライバ/ランタイム 4.2、Cuda 機能 1.1 です。

何かアドバイス?

4

1 に答える 1

1

バッファーの末尾 (コピー元またはコピー先) を超えてコピーしようとしたり、不適切なポインターを完全に参照したりするなど、ポインターの問題が発生していると思います。無効なメモリに足を踏み入れたら、まともなエラー レポートや有用なバックトレースを期待しないでください。

バックトレースを見ると、OpenGL にマップされたデバイス メモリ空間から意図せずにコピーしようとしているために、GLRegister 呼び出しが呼び出される可能性があります。

cuda-memcheck や valgrind を試してください。または、簡単に再現できるため、memcpy に渡す値を (デバッガーまたは printf によって) 検証することから始めます。または、問題が解決するまでコードの一部を無効にして、バイナリ検索を手動で開始します。

于 2012-05-22T19:41:16.653 に答える