我已经实现了一个计算向量间距离的内核。程序按预期运行,结果与CPU相同。该程序释放设备中使用的资源(cudaFree
)并正常退出。另外,在退出之前我使用cudaDeviceReset()
。
所有CUDA API调用都被包装以检查错误,如Eclipse Nsight API示例中所示。执行程序时不会报告错误。
在对全局内存执行读或写访问之前,内核检查内存位置索引,即if ( idx < N ) ...
在CPU中,循环执行p
次,在调用内核之前执行cudaMalloc
和cudaMemcpy(HtoD)
,在下一次迭代之前执行cudaFree()
。在内核之后和cudaFree调用之前放置cudaDeviceSynchronize()
以等待GPU启动工作完成。
在发布和调试模式下分析程序时,cuda-memcheck
不会报告任何错误。
但是,有时计算机在运行程序时会重新启动,但我没有找到任何重复模式来跟踪错误。所以,我的问题是:我怎么能捕获这个错误?
我正在Ubuntu x86_64 GNU / Linux中使用CUDA 5.0版,V0.2.1221并运行X系统。该设备是GTX480,安装的驱动程序版本是304.54。
答案 0 :(得分:1)
这是与设备温度有关的问题。
根据@Robert Crovella的评论,我在x86_64 GNU / Linux专用服务器(没有运行X系统)中执行内核,也使用CUDA 5但使用GTX680。该程序一直运行成功。
我使用nvidia-smi
命令跟踪使用的GPU内存和温度,发现我的计算机在温度超过70度时进行了重置。
因此,该问题与任何内存泄漏或内存访问冲突无关,但需要大量使用该设备。