【问题标题】:Killing OpenCL Kernels杀死 OpenCL 内核
【发布时间】:2013-04-24 21:23:30
【问题描述】:

有没有办法通过 OpenCL API 杀死正在运行的 OpenCL 内核?我在规范中没有找到任何东西。

我能想出的唯一解决方案是 1) 定期检查内核中主机在希望内核停止时写入的标志,或 2) 在单独的进程中运行内核并终止整个进程。我认为这两种解决方案都不是非常优雅的解决方案,而且我不确定 #1 是否能可靠地工作。

【问题讨论】:

  • 我也不确定第二个选项是否很好。即使您终止进程,内核仍会在 GPU 上运行。我试图在我的光线追踪器中做类似的事情。我在与内核不同的线程中检查了键盘。如果用户按下“ESCAPE”,我希望程序立即结束。最后我看了一下,当程序结束时,我得到了一个核心转储。
  • 我完全同意,它们都是不好的选择。我希望那里有更好或更标准的选择。
  • 拔掉插头,说真的,你最好将内核分成定义明确(且时间短)的计算部分,并将控制决策留给主机端。例如,如果 nvidia 驱动程序在几秒钟内没有完成并且您的 gpu 连接到显示器,则会杀死您的内核

标签: kernel opencl infinite-loop kill


【解决方案1】:

不,OpenCL API 不允许中断正在运行的内核。在某些系统上,运行超过几秒钟的内核会被驱动程序杀死。

参考。对于 Windows:Timeout Detection and Recovery of GPUs through WDDM,对于 Linux+NVidia:Using CUDA and X

标准中的任何内容都不能保证您的选项 1 有效。它几乎肯定不会。 您的选项 2 将起作用,但是您必须与其他进程进行通信。

按照 cmets 的建议,将内核拆分为更小的内核可能是最好的选择。

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 2021-10-24
    • 2020-07-04
    • 2021-11-03
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    相关资源
    最近更新 更多