消灭 OpenCL 核函数

3

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

我能想到的唯一解决方案是:1)定期检查内核中主机写入的标记以停止内核,或者2)在单独的进程中运行内核并杀死整个进程。我认为这两种都不是很优雅的解决方案,而且我不确定#1甚至可靠工作。


我也不确定第二个选项是否好。即使您杀死进程,内核仍在GPU上运行。我曾尝试在我的光线追踪器中执行类似的操作。我在与内核不同的线程中检查键盘。如果用户按下“ESC”键,我希望程序立即结束。最后一次我查看时,程序结束时会出现核心转储。 - user2088790
我完全同意,它们都不是好的选择。我希望能有更好或更标准的选择。 - agrippa
拔掉插头,认真地说,你最好将内核分成明确定义的(和短时间的)计算部分,并将控制决策留给主机端。例如,如果您的GPU连接到显示器上,nvidia驱动程序会在几秒钟内未完成时杀死您的内核。 - isti_spl
1个回答

1
不,OpenCL API 不允许中断正在运行的内核。在某些系统上,运行时间超过几秒钟的内核将被驱动程序终止。 参考文献:对于 Windows 系统,请查看 Timeout Detection and Recovery of GPUs through WDDM;对于 Linux+NVidia 系统,请查看Using CUDA and X。 标准中没有任何保证您的选项1会起作用。它几乎肯定不会起作用。 您的选项2将起作用,但然后您将不得不与其他进程通信。 如评论所建议的那样,将内核分割为较小的内核可能是最佳选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接