hi,All,
我在编写openCL时调用clEnqueueMapBuffer,在其中blocking_map 是CL_TRUE,event_wait_list以及num_events_in_wait_list 都是NULL。却出现了CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST的错误,我查了一下引起该错误的原因是:
CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST if the map operation is blocking and the execution status of any of the events in event_wait_list is a negative integer value.
event_wait_list
但我的event_wait_list是NULL,根本没有值。该问题主要出现在mali-t760 上,而adreno 以及桌面GPU都没有出现类似的问题。不知是不是驱动bug?
Thx,
Phenix.
HI All,
非常感谢你们的回答。这个问题已经解决了。我总结一下吧:
1.首先,刚开始的时候出现的是CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST错误,出现在map buffer 函数中
然后根据xin.jin 和 abarbier why it apperars an CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST error when read buffer from gpu back to host memory? 的回答,定 位到是某一个kernel 内部执行错误(CL_INVALID_OPERATION);
2.为了定位kernel 中的错误,一直以为是kernel 过于复杂才导致执行错误,所以就将kernel 中的local memory,vectorization以及reduction都去掉,但结果还是同样引起上面的错误。
3.最后没办法,只有一句一句的定位,终于定位出了哪里出错:
kernel 中有一个变量是uint 类型linestep,linestep *(-1) 的结果竟然不是想象中的-linestep(应该是某个很大或很小的数),导致访问越界。只好自己进行显示转化convert_int(linestep)*(-1)得到。为什么这么简单的转换都需要自己显示转换。一个uint * int 很明显应该是先将uint 转换成int 再相乘,不知道drive 里面是怎么转的?sherizhang
谢谢,
Hi phenix,
driver会把int解释成uint,所以-1就会变成一个很大的数,导致最后访问越界。
BR,
Sheri
这个转换很奇怪的,有什么资料吗?
你可以参考C语言的隐式数据转换,希望对你有帮助,我找到一个链接,你可以看看;或者也可以搜索隐式数据转换。
Usual Arithmetic Conversions