有没有办法通过 OpenCL API 杀死正在运行的 OpenCL 内核?我在规范中没有找到任何东西。
我能想出的唯一解决方案是 1) 定期检查内核中的一个标志,当主机希望内核停止时写入该标志,或者 2) 在单独的进程中运行内核并终止整个进程。我认为这两种解决方案都不是非常优雅的解决方案,而且我不确定#1 是否能可靠地工作。
有没有办法通过 OpenCL API 杀死正在运行的 OpenCL 内核?我在规范中没有找到任何东西。
我能想出的唯一解决方案是 1) 定期检查内核中的一个标志,当主机希望内核停止时写入该标志,或者 2) 在单独的进程中运行内核并终止整个进程。我认为这两种解决方案都不是非常优雅的解决方案,而且我不确定#1 是否能可靠地工作。
不,OpenCL API 不允许中断正在运行的内核。在某些系统上,运行超过几秒钟的内核会被驱动程序杀死。
参考。对于 Windows:超时检测和通过 WDDM 恢复 GPU,对于 Linux+NVidia:使用 CUDA 和X。
标准中的任何内容都不能保证您的选项 1 会起作用。它几乎肯定不会。您的选项 2 将起作用,但随后您将不得不与其他进程进行通信。
正如评论中所建议的,将内核拆分成更小的内核可能是最好的选择。