This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

在malit760 上调用openCL的clEnqueueMapBuffer,出现CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST的错误

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是NULL,根本没有值。该问题主要出现在mali-t760 上,而adreno 以及桌面GPU都没有出现类似的问题。不知是不是驱动bug?

Thx,

Phenix.

Parents
  • HI All,

    非常感谢你们的回答。这个问题已经解决了。我总结一下吧:

    1.首先,刚开始的时候出现的是CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST错误,出现在map buffer 函数中

      然后根据xin.jinabarbier 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

    谢谢,

    Phenix.

Reply
  • HI All,

    非常感谢你们的回答。这个问题已经解决了。我总结一下吧:

    1.首先,刚开始的时候出现的是CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST错误,出现在map buffer 函数中

      然后根据xin.jinabarbier 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

    谢谢,

    Phenix.

Children