【问题标题】:OpenCL clEnqueueReadBuffer segfaults randomlyOpenCL clEnqueueReadBuffer segfaults 随机
【发布时间】:2013-05-12 17:51:09
【问题描述】:

我很难确定为什么在我的代码中的以下行随机出现分段错误:

rc = clEnqueueReadBuffer(ompctx->clctx->queue,
                ompctx->result, CL_TRUE, 0, sizeof(int), &pos,
                1, &ompctx->clctx->ev1, NULL);

ompctx->result 是一个用作整数数组的内存对象,pos 是一个主机对象,声明为:

int pos

我尝试在堆栈和全局空间中声明 pos,结果没有改变。 我尝试等待最后一个内核完成(如上所述,虽然我不应该这样做,因为我有一个有序的命令队列)并且没有等待,结果仍然相同。

我正在使用 AMD APP v2.8,并尝试了具有 8 个 CPU 的 i7 和 AMD FirePro v8800。两者都表现出相同的问题。

我是否遗漏了一些明显的东西?我还应该检查什么?

【问题讨论】:

  • 也许您正在取消引用 null 指针?如果没有看到更多代码,就很难说。
  • 我打印了指针,在调用 ReadBuffer 之前它们看起来都还不错。队列在此调用之前使用,它总是成功,结果也成功使用,pos 是一个全局变量,无论事件是否存在,它们都没有任何区别。所以我不认为这是一个空指针取消引用。
  • 您是否尝试过使用英特尔 OpenCL 平台?它会给你同样的错误吗?
  • 您是否检查了到目前为止所有 OpenCL 调用的返回值?
  • ananthonline:没有,但我想过。问题是我需要 AMD 的,但澄清这不是实现的错也无妨。 Eric Bainville:是的,每一个。总是。

标签: c segmentation-fault opencl


【解决方案1】:

因为您将阻塞参数设置为 CL_TRUE,所以 clEnqueueReadBuffer 在传输完成之前不会返回,这意味着在传输之前排队的所有先前命令也必须完成。很可能您之前的一个 OpenCL 调用将写入越界或其他内容的命令排入队列(因为它是随机发生的),并且在调用 clEnqueueReadBuffer 之前不会执行该命令。尝试在每次调用 OpenCL 后在命令队列上调用 clFinish,以强制每个命令在入队后立即完成,并插入几个 printf 语句,以便找出真正失败的语句。

【讨论】:

  • 我最终这样做了,然后从 amd 崩溃到 cl blas 库。忘了在这里添加解决方案,谢谢:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 2014-10-23
  • 2012-04-12
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多