【发布时间】:2018-10-30 01:35:05
【问题描述】:
最近我写了OpenCL程序使用AMD GPU,但是由于我是新手,一些我无法直接检测到的问题会导致启动内核死机,并且clinfo在这种情况下也没有显示任何内容。有什么方法可以杀死 AMD GPU 上正在运行的内核吗?每次内核死机时,我现在都依靠重新启动来修复它。
【问题讨论】:
最近我写了OpenCL程序使用AMD GPU,但是由于我是新手,一些我无法直接检测到的问题会导致启动内核死机,并且clinfo在这种情况下也没有显示任何内容。有什么方法可以杀死 AMD GPU 上正在运行的内核吗?每次内核死机时,我现在都依靠重新启动来修复它。
【问题讨论】:
没有标准的方法来停止已经开始执行的内核。您应该编写您的内核,以便它们可预测地停止 - 即不要使用无限循环,而是重复地将内核从主机排入队列。
【讨论】:
我知道可以挂起一些 AMD GPU 的一件事是,有一个屏障只能由工作组的 一些 工作项执行。请注意,这不是 GPU 中的错误,OpenCL 规范明确说明了有关 barrier() 的内容:
执行内核的工作组中的所有工作项都必须遇到此函数。
因此,要么所有工作项,要么没有一个工作项必须遇到障碍。如果只有一些人这样做,您的程序可能会挂在 GPU 上。所以我会检查 OpenCL 代码中的类似内容:
if (localmem[i] > 0) {
barrier(CLK_LOCAL_MEM_FENCE);
}
您也可以尝试在您的代码中使用Oclgrind,它是一个 OpenCL GPU 模拟器,可用于查找 OpenCL 代码中的问题。
【讨论】: