【问题标题】:Is there any way to terminate a kernel on AMD GPU with OpenCL?有没有办法用 OpenCL 终止 AMD GPU 上的内核?
【发布时间】:2018-10-30 01:35:05
【问题描述】:

最近我写了OpenCL程序使用AMD GPU,但是由于我是新手,一些我无法直接检测到的问题会导致启动内核死机,并且clinfo在这种情况下也没有显示任何内容。有什么方法可以杀死 AMD GPU 上正在运行的内核吗?每次内核死机时,我现在都依靠重新启动来修复它。

【问题讨论】:

    标签: opencl gpgpu amd


    【解决方案1】:

    没有标准的方法来停止已经开始执行的内核。您应该编写您的内核,以便它们可预测地停止 - 即不要使用无限循环,而是重复地将内核从主机排入队列。

    【讨论】:

    • 感谢您的建议!但是,我认为这不是根本原因。毕竟没有无限循环,if条件也很简单。
    • @user9180998 您能否将内核代码添加到您的问题中以便我们查看?
    【解决方案2】:

    我知道可以挂起一些 AMD GPU 的一件事是,有一个屏障只能由工作组的 一些 工作项执行。请注意,这不是 GPU 中的错误,OpenCL 规范明确说明了有关 barrier() 的内容:

    执行内核的工作组中的所有工作项都必须遇到此函数。

    因此,要么所有工作项,要么没有一个工作项必须遇到障碍。如果只有一些人这样做,您的程序可能会挂在 GPU 上。所以我会检查 OpenCL 代码中的类似内容:

    if (localmem[i] > 0) {
       barrier(CLK_LOCAL_MEM_FENCE);
    }
    

    您也可以尝试在您的代码中使用Oclgrind,它是一个 OpenCL GPU 模拟器,可用于查找 OpenCL 代码中的问题。

    【讨论】:

    • 哦,我很确定这不是障碍引起的,因为评论障碍不能解决这个问题。顺便问一下,非法内存访问会导致这种情况吗?还是只会触发段故障?非常感谢!
    • “进行非法内存访问”
    • ...此外,非法内存访问是 Oclgrind 会捕获的,因此您应该尝试一下。
    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2020-07-19
    • 1970-01-01
    相关资源
    最近更新 更多