我很难确定为什么在代码的以下行随机出现分段错误:
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应用v2.8,我在一个i7上尝试了8个CPU和一个AMD FirePro v8800。两者都有同样的问题。
我是不是漏掉了一些显而易见的东西?我还需要检查什么?
最佳答案
因为blocking参数设置为CL_TRUE,所以在传输完成之前,clEnqueueReadBuffer不会返回,这意味着在传输完成之前排队的所有先前命令也必须返回。以前的OpenCL调用之一可能会将写入越界或其他内容(因为它是随机发生的)的命令排队,并且在调用clEnqueueReadBuffer之前不会执行该命令。尝试在每次OpenCL调用后对命令队列调用clFinish,以强制每个命令在排队后立即完成,并插入两个printf语句,以便您可以确定哪个命令真正失败。