【问题标题】:Handling Ctrl+C exception with GPU使用 GPU 处理 Ctrl+C 异常
【发布时间】:2012-05-04 21:27:22
【问题描述】:

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

【问题讨论】:

  • 正如我之前写给您的回复一样,cudaDeviceReset() 非常适合破坏上下文并释放进程分配给自己的资源。您应该在退出时在代码中调用它。但它不能解决其他进程引起的问题。如果您的主机代码或设备代码在不使主机驱动程序或设备处于需要重新启动的危险状态的情况下无法运行和终止,那么您首先要解决更严重的设计或代码问题。 CUDA linux 驱动程序过去曾遇到过 Ctrl+C 问题,但这些问题在几年前就已修复 AFAIK .....

标签: memory-leaks cuda nvidia gpu


【解决方案1】:

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

this question 的答案可能会有所帮助。和this one。还有this one

【讨论】:

  • 但是在设计阶段呢?在设计阶段,我可能不得不使用 Ctrl+C 中途停止运行。在这种情况下,尽管采用了适当的故障保护技术,使用的 GPU 内存仍将保持这种状态。在这种情况下,如何确保在重新运行程序之前将这些 GPU 内存位置重置为 NULL。
  • @Abhinav:我只是不相信实践中会发生这种情况。您能否编辑您的问题以包括代码异常终止导致未释放的 GPU 资源/设备“内存泄漏”的证据?
  • 同意。我使用 CTRL+C,在简单的应用程序中,我通常不会从这个答案中获取自己的建议并正确处理中断,而且我很少需要重新启动计算机(除非我编写了非常糟糕的 CUDA 代码导致机器挂起)。跨度>
  • @talonmies 好吧,我可以试一试,我得把整个 4gb GPU 全局填满,然后中断程序.. 让我试着这样做,形成一个更具体的问题..
  • 我觉得没有一个答案能真正回答@Abhianav 的问题。 Ctrl-C 不是这里的问题,因为您可以在 SIGINT 处理程序中包含cudaDeviceReset()。 (Abhinav 和我的)问题是:由于某种原因,程序退出后 GPU 处于某种状态,这会阻止它再次正确运行代码 [正确 = 就像在“计算机重启”之后一样]。因此问题是:(1)即使在退出时确实执行了cudaDeviceReset(),GPU 怎么会进入这种状态,以及(2)是否有软件(可能是操作系统)的方式让它进入“新鲜”状态。
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 2011-04-27
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多