0

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

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。两者都表现出同样的问题。

我错过了一些明显的东西吗?我还应该检查什么?

4

1 回答 1

6

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

于 2013-07-17T21:41:47.907 回答