我很难确定在我的代码中的下一行随机发生分段错误的原因:
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。两者都表现出同样的问题。
我错过了一些明显的东西吗?我还应该检查什么?
答案 0 :(得分:5)
因为您将阻塞参数设置为CL_TRUE,所以clEnqueueReadBuffer将不会返回,直到传输完成,这意味着在传输之前排队的所有先前命令也必须完成。您之前的一个OpenCL调用可能会将一个写出边界或其他内容的命令排入队列(因为它是随机发生的),并且在调用clEnqueueReadBuffer之前不会执行该命令。在每次执行OpenCL调用后,尝试在命令队列上调用clFinish,以强制每个命令在排队后立即完成,并插入一些printf语句,以便找出哪一个确实失败。