小さなアニメーションを描画し、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 です。
何かアドバイス?