2013-05-17 43 views
0

我有很难确定为什么分割故障在我的代码下面的行随机发生:的OpenCL clEnqueueReadBuffer段错误随机

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

ompctx->结果是用作整数数组的存储对象并且pos是一个主对象,声明为:

int pos 

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

我使用的是AMD APP v2.8,我尝试过使用8个CPU的i7和AMD FirePro v8800。两者都表现出同样的问题。

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

+0

也许你解引用了一个'null'指针?没有看到更多的代码,这将很难说。 –

+0

我打印指针,并且在调用ReadBuffer之前它们都看起来没问题。这个队列在调用之前就被使用了,并且它总是成功的,结果也被成功地使用,pos是一个全局变量,如果它们在那里或者没有,这些事件没有什么区别。所以我不认为这是一个空指针解引用。 –

+0

您是否尝试过使用英特尔OpenCL平台?它会给你同样的错误吗? – Ani

回答

4

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

+0

我最终这样做,然后在amd的cl blas库中崩溃。忘了在这里添加解决方案,谢谢你的:-) –