gpt4 book ai didi

c++ - 检测 Windows TDR 并从中恢复?

转载 作者:太空宇宙 更新时间:2023-11-04 11:36:26 26 4
gpt4 key购买 nike

我在处理一些 OpenCL 代码时遇到了一个奇怪的问题,难得一见,Windows TDR将启动并重置 GPU。有问题的内核仅运行 150 毫秒,并且会在 TDR 将其关闭之前运行数千次(在许多小时内),因此我确信内核本身不是罪魁祸首。

我担心的是,一旦 TDR 启动,内核就会死掉,程序就会陷入永恒的边缘状态。据我所知,对 clFinish 的调用永远不会返回。

有没有办法检测内核是否已经死亡,以便可以优雅地处理它?

最佳答案

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

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

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

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

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

关于c++ - 检测 Windows TDR 并从中恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22918009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com