【问题标题】:How to kill CUDA Kernel programatically如何以编程方式杀死 CUDA 内核
【发布时间】:2012-12-21 21:57:09
【问题描述】:

我有一个 CUDA 内核,在我的旧 Tesla 卡中使用了 20 多秒。 如果内核运行超过 20 秒,我想以编程方式终止 CUDA 内核。我的意图是,如果内核运行时间超过 20 秒,则应终止该内核并运行另一个精度较低的内核。

我的操作系统是 Windows 7 64 位。 CUDA 版本是 5.0。 GPU 是 Tesla C1060

请帮助我在不退出应用程序的情况下杀死 CUDA 内核。

【问题讨论】:

  • 您的问题是关于哪一部分?时机还是杀戮?
  • 我认为这不可能。另外,我认为没有必要。当然,您可以根据问题大小和输入参数估计内核的运行时间,并据此选择精度吗?或者,您可以对内核进行计时并在程序了解有关输入参数如何影响运行时间的更多信息时动态调整切换点。
  • @RogerDahl:听起来你假设 OP 可以解决停机问题。
  • @leftaroundabout:一点也不。这不是内核“是否”会完成的问题,而是“何时”完成的问题。
  • @RogerDahl 确定 WCET 通常是equivalent to halting problem,但无论如何。我所说的“不是图灵完备”的意思可能是你所说的“具有不同大小输入的相同内核”:没有任何循环以 nontrivial 方式依赖于输入,例如只从 0 迭代到一个常数。 – 但是,是的,我们需要这里的一般情况,因为我们对 OP 内核的功能一无所知。输入大小和内核运行时间之间的关系可能根本不是微不足道的。

标签: windows cuda gpu gpgpu


【解决方案1】:

您可以在 CC 2.0 或更高版本的设备上使用assert(失败)从内核中停止现有内核的运行。但是,我认为这不会达到既定目的,至少不方便。

您还可以使用cudaDeviceReset() 从主机端停止设备的操作。我还没有完全考虑到这一点,但应该可以在主机端监控某种计时器,并在超时时间结束时重置设备,如果结果的某些指示不存在。这种类型的重置有点像撬棍,因此您需要完全重新启动该设备上的操作(包括 cudaMallocs 等)才能重新启动所需的操作。

请注意,cudaDeviceReset() 本身不足以将 GPU 恢复到正确的功能行为。为了实现这一点,“拥有”过程也必须终止。见here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    相关资源
    最近更新 更多