我在处理一些OpenCL代码时遇到了一个奇怪的问题,我正在研究每个蓝色月亮中的Windows TDR何时插入并重置GPU。令人讨厌的内核仅运行150毫秒,并且在TDR杀死它之前,它将运行数千次(在许多小时的过程中),因此我敢肯定,内核本身不应该受到指责。

我担心的是,一旦启动TDR,内核就会死亡,并且程序将陷入永恒的困境。据我所知,对clFinish的调用永远不会返回。

有没有一种方法可以检测内核是否已死亡,以便可以正常处理它?

最佳答案

我设法提出了一个解决方案,尽管它远非最佳方案。

我已经修改了程序,以便在单独的线程中完成OpenCL处理。我在父进程和子进程之间创建了一个全局共享的监视程序变量。当父级将处理函数作为线程生成时,它将变量设置为当前时间(以毫秒为单位)。处理线程完成后,它将看门狗变量重置为零。

当父线程等待处理线程完成时,它会密切关注看门狗计时器。如果计时器超过某个阈值,则程序将强制终止自身,而无需等待子进程返回。

无论是否设置了Windows TDR,此解决方案都可以使用。如果设置了TDR并且驱动程序重置,则对clFinish()的调用将永远不会返回,并且一旦看门狗定时器触发,父对象将终止。如果未设置TDR,则失控过程将冻结显示,但是一旦看门狗定时器跳闸,父进程将终止处理,从而终止冻结。

既然我已经设置了看门狗,那么我只需将程序包装在脚本中:如果程序错误终止(正返回代码),则程序将重新运行。

10-01 12:02