2013-04-30 163 views
3

有什么办法通过OpenCL API杀死正在运行的OpenCL内核?我没有在规范中找到任何内容。我可以想到的唯一解决方案是1)定期检查内核中的一个标志,当主机想要内核停止时它会写入内核,或者2)在单独的进程中运行内核并且终止整个进程。我不认为这两种解决方案都是非常优雅的,我不确定#1是否能够可靠工作。杀死OpenCL内核

+0

我不确定第二个选项是否如此好。即使您终止了进程,内核仍然在GPU上运行。我试图在我的射线追踪器中做类似的事情。我在单独的线程中检查键盘而不是内核。如果用户按下'ESCAPE',我希望程序立即结束。最后,我看着它,当编程结束时,我正在获得核心转储。 – 2013-05-01 08:19:46

+0

我完全同意,他们都是不好的选择。我希望有更好或更标准的选择。 – agrippa 2013-05-01 14:19:35

+0

拔出插头,认真的你最好将内核分割成定义好的(和短时间)计算部分,并将控制决定留给主机端。例如,如果nvidia驱动程序在几秒内没有完成并且您的GPU连接到显示器,则它会杀死您的内核 – 2013-05-02 14:05:54

回答

1

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

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

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

按照注释中的建议,在较小的内核中分割内核可能是最好的选择。