Memory leaks 处理Ctrl+;GPU的C异常

Memory leaks 处理Ctrl+;GPU的C异常,memory-leaks,cuda,nvidia,gpu,Memory Leaks,Cuda,Nvidia,Gpu,我正在使用一些GPU程序(使用CUDA4.1和C),有时(很少)我不得不中途使用Ctrl+C来处理一些异常。早些时候,我尝试使用CudaDeviceReset()函数,但取代了对CudaDeviceReset()的信任,因此我开始用老式的方式处理此类异常,即“计算机重启”。随着项目规模的增长,这种方法变得令人头痛。如果有人能提出更好的解决方案,我将不胜感激。我认为这个问题更为根本——它实际上是一个应用程序设计问题,而不是CUDA问题。如果您正确地设计应用程序以定期检查中断,并在中断时退出主循环并

我正在使用一些GPU程序(使用CUDA4.1和C),有时(很少)我不得不中途使用Ctrl+C来处理一些异常。早些时候,我尝试使用CudaDeviceReset()函数,但取代了对CudaDeviceReset()的信任,因此我开始用老式的方式处理此类异常,即“计算机重启”。随着项目规模的增长,这种方法变得令人头痛。如果有人能提出更好的解决方案,我将不胜感激。

我认为这个问题更为根本——它实际上是一个应用程序设计问题,而不是CUDA问题。如果您正确地设计应用程序以定期检查中断,并在中断时退出主循环并清理资源,那么您不应该有这个问题(甚至可以在退出时正确调用
cudaDeviceReset()


对的回答可能会有帮助。和。

正如我之前写的回复一样,
cudaDeviceReset()
对于销毁上下文和释放进程自己分配的资源来说是非常好的。您应该在退出时在代码中调用它。但是它无法修复由其他进程引起的问题。如果您的主机代码或设备代码无法运行和终止,而主机驱动程序或设备处于它需要的危险状态重新启动后,您需要首先修复更严重的设计或代码问题。CUDA linux驱动程序在过去有Ctrl+C问题,但这些问题在几年前已经修复……但在设计阶段如何。在设计阶段,我可能必须使用Ctrl+C中途停止运行。在这种情况下,使用的GPU内存将保持不变适当的故障保护技术已经到位。在这种情况下,在重新运行程序之前,我如何确保这些GPU内存位置被重置为NULL。@阿比纳夫:我只是不相信在实践中会发生这种情况。您能否编辑您的问题,以包括代码异常终止导致未释放GPU资源/设备的证据“内存泄漏”?同意。我使用CTRL+C,在简单的应用程序中,我通常不会从这个答案中接受我自己的建议并正确处理中断,而且我很少需要重新启动我的计算机(除非我编写了非常糟糕的挂起计算机的CUDA代码)@talonmies好的,我可以试试,我必须填满整个4gb GPU全局,然后中断程序。让我试着这样做,并形成一个更具体的问题。我觉得没有一个答案真正回答了@Abhianav的问题。这里的问题不是Ctrl-C,因为你可以包括
CudaDeviceSet()
在SIGINT handler中。问题(Abhinav和我的)是:出于某种原因,程序退出后的GPU处于某种状态,这会阻止它再次正确运行代码[正确=就像在“计算机重新启动”后一样]。因此问题是:(1)GPU如何在确实执行
CudaDeviceSet()后也能进入这种状态
在退出时,以及(2)是否有软件(可能是操作系统)方法使其进入“全新”状态。