c - OpenCL clEnqueueReadBuffer 段错误随机

标签 c segmentation-fault opencl

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

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 上进行了尝试。两者都表现出同样的问题。

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

最佳答案

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

关于c - OpenCL clEnqueueReadBuffer 段错误随机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16611110/

相关文章:

macos - OpenCL Mac OS 从命令行编译,未找到 openclc 命令

OpenCL 研究/学术论文

OpenCL:在内核中手动抛出异常

c - 警告 :assignment makes pointer from integer without a cast

c - 意外的 C 代码输出

c - 段错误,调试

C++ 递归段错误。你能帮我看看我做错了什么吗?

c - 数组 "pointer"上写入值?

c++ - gcc 错误消息库

c++私有(private)属性可以在构造函数中使用,但在其他方法中会出现段错误