diff options
author | Junyan He <junyan.he@intel.com> | 2016-04-13 16:00:06 +0800 |
---|---|---|
committer | Junyan He <junyan.he@intel.com> | 2016-04-13 16:00:06 +0800 |
commit | 1e4a0762967aea9c1e53c79d880da06bf364983b (patch) | |
tree | 2c446cf63913da5f082b590154cdb4485f5d693e | |
parent | 2c7e560cb9bf932f92499044789cf83f93dd3f58 (diff) |
event
-rw-r--r-- | backend/src/driver/cl_gen_command_queue.cpp | 37 | ||||
-rw-r--r-- | backend/src/driver/cl_gen_driver.h | 4 | ||||
-rw-r--r-- | backend/src/driver/cl_gen_driver.hpp | 5 | ||||
-rw-r--r-- | backend/src/driver/cl_gen_mem.cpp | 37 | ||||
-rw-r--r-- | include/cl_driver.h | 4 |
5 files changed, 66 insertions, 21 deletions
diff --git a/backend/src/driver/cl_gen_command_queue.cpp b/backend/src/driver/cl_gen_command_queue.cpp index 66de1173..e01aaec9 100644 --- a/backend/src/driver/cl_gen_command_queue.cpp +++ b/backend/src/driver/cl_gen_command_queue.cpp @@ -38,8 +38,8 @@ bool GenGPUWorkItem::setStatus(cl_int status) return false; pthread_mutex_lock(&event->lock); - GBE_ASSERT(status < event->status); //Should never go back. - event->status = status; + GBE_ASSERT(state < event->status); //Should never go back. + event->status = state; cl_event_user_cb user_cb = event->user_cb; while (user_cb) { if (user_cb->status < event->status) @@ -95,10 +95,11 @@ static void *workerFunction(void *Arg) cl_uint lastCookie = gpuCmdQueue->cookie; while (gpuCmdQueue->quit == false) { - if (gpuCmdQueue->workItems.empty() || lastCookie == gpuCmdQueue->cookie) { + while (gpuCmdQueue->workItems.empty() || lastCookie == gpuCmdQueue->cookie) { pthread_cond_wait(&gpuCmdQueue->cond, &gpuCmdQueue->mutex); if (gpuCmdQueue->quit) { - break; + pthread_mutex_unlock(&gpuCmdQueue->mutex); + return NULL; } } @@ -172,7 +173,7 @@ bool GenGPUCommandQueue::enqueueWorkItem(GenGPUWorkItem* item) return true; } -bool GenGPUCommandQueue::waitForEvents(cl_event* events, int num) +bool GenGPUCommandQueue::waitForEvents(const cl_event* events, int num) { pthread_mutex_lock(&this->mutex); if (this->quit) { // already destroy the queue? @@ -267,7 +268,7 @@ void GenGPUCommandQueue::waitForFinish(void) pthread_mutex_unlock(&this->mutex); } -void GenGPUCommandQueue::userEventChange(void) +void GenGPUCommandQueue::eventStateChanged(void) { pthread_mutex_lock(&this->mutex); if (this->quit) { // already destroy the queue? @@ -280,6 +281,30 @@ void GenGPUCommandQueue::userEventChange(void) pthread_mutex_unlock(&this->mutex); } +bool GenGPUCommandQueue::setEventStatus(cl_event event, cl_int state) +{ + GBE_ASSERT(event); + pthread_mutex_lock(&event->lock); + GBE_ASSERT(state < event->status); //Should never go back. + event->status = state; + cl_event_user_cb user_cb = event->user_cb; + while (user_cb) { + if (user_cb->status < event->status) + continue; + + if (user_cb->executed) + continue; + + user_cb->executed = CL_TRUE; + user_cb->pfn_notify(event, event->status, user_cb->user_data); + user_cb = user_cb->next; + } + pthread_mutex_unlock(&event->lock); + + this->eventStateChanged(); // Notify others + return true; +} + GenGPUCommandQueue::GenGPUCommandQueue(dri_bufmgr *bufmgr, drm_intel_context *ctx) { GBE_ASSERT(bufmgr != NULL); diff --git a/backend/src/driver/cl_gen_driver.h b/backend/src/driver/cl_gen_driver.h index 27e3b188..3849bc3d 100644 --- a/backend/src/driver/cl_gen_driver.h +++ b/backend/src/driver/cl_gen_driver.h @@ -55,9 +55,9 @@ cl_int GenCreateBuffer(cl_mem mem, const cl_device_id device); cl_int GenReleaseMem(cl_mem mem, const cl_device_id device); cl_int GenEnqueueMapBuffer(cl_command_queue queue, cl_mem mem, void** ret_addr, cl_bool block, cl_map_flags flags, size_t offset, size_t size, cl_uint num_events, - const cl_event *event_list, cl_event *event_ret); + const cl_event *event_list, cl_event event_ret); cl_int GenEnqueueUnmapMem(cl_command_queue queue, cl_mem mem, void *mapped_ptr, - cl_uint num_events, const cl_event *event_list, cl_event *event_ret); + cl_uint num_events, const cl_event *event_list, cl_event event_ret); cl_int GenEnqueueNDRangeKernel(cl_command_queue queue, cl_kernel kernel, const uint32_t work_dim, const size_t *global_wk_off, const size_t *global_wk_sz, const size_t *local_wk_sz, cl_uint num_events, diff --git a/backend/src/driver/cl_gen_driver.hpp b/backend/src/driver/cl_gen_driver.hpp index e372dfc8..fd25ff73 100644 --- a/backend/src/driver/cl_gen_driver.hpp +++ b/backend/src/driver/cl_gen_driver.hpp @@ -252,8 +252,9 @@ struct GenGPUCommandQueue { list<GenGPUWorkItem*> workItems; cl_uint cookie; bool enqueueWorkItem(GenGPUWorkItem* item); - void userEventChange(void); - bool waitForEvents(cl_event* events, int num); // True means ok, False means canceled. + void eventStateChanged(void); + bool setEventStatus(cl_event event, cl_int state); + bool waitForEvents(const cl_event* events, int num); // True means ok, False means canceled. void waitForFlush(void); void waitForFinish(void); GenGPUCommandQueue(dri_bufmgr *bufmgr, drm_intel_context *ctx); diff --git a/backend/src/driver/cl_gen_mem.cpp b/backend/src/driver/cl_gen_mem.cpp index ae103b36..cf35f06c 100644 --- a/backend/src/driver/cl_gen_mem.cpp +++ b/backend/src/driver/cl_gen_mem.cpp @@ -252,7 +252,7 @@ static void* genDoMapBuffer(GenGPUMem* genMem, cl_mem mem, cl_map_flags flags, s extern "C" cl_int GenEnqueueMapBuffer(cl_command_queue queue, cl_mem mem, void** ret_addr, cl_bool block, cl_map_flags flags, size_t offset, size_t size, cl_uint num_events, - const cl_event *event_list, cl_event *event_ret) + const cl_event *event_list, cl_event event_ret) { if (mem->type != CL_MEM_OBJECT_BUFFER) { return CL_INVALID_VALUE; @@ -273,20 +273,39 @@ cl_int GenEnqueueMapBuffer(cl_command_queue queue, cl_mem mem, void** ret_addr, GenGPUCommandQueue* gpuQueue = (GenGPUCommandQueue*)getGenCommandQueuePrivate(queue); GBE_ASSERT(gpuQueue); gpuQueue->waitForFlush(); - } - retAddr = genDoMapBuffer(genMem, mem, flags, offset, size); - if (retAddr == NULL) - return CL_MAP_FAILURE; + if (event_list) { // Need to wait for events. + if (gpuQueue->waitForEvents(event_list, num_events) == false) { + /* canceled or some errors. */ + return CL_MAP_FAILURE; + } + } - if (ret_addr) - *ret_addr = retAddr; - return CL_SUCCESS; + retAddr = genDoMapBuffer(genMem, mem, flags, offset, size); + if (retAddr == NULL) { + if (event_ret) { + gpuQueue->setEventStatus(event_ret, -1); // Set error for that event. + } + return CL_MAP_FAILURE; + } + + if (ret_addr) + *ret_addr = retAddr; + + if (event_ret) { + gpuQueue->setEventStatus(event_ret, CL_COMPLETE); + } + return CL_SUCCESS; + } + + // Never come to here. + GBE_ASSERT(0); + return CL_MAP_FAILURE; } extern "C" cl_int GenEnqueueUnmapMem(cl_command_queue queue, cl_mem mem, void *mapped_ptr, - cl_uint num_events, const cl_event *event_list, cl_event *event_ret) + cl_uint num_events, const cl_event *event_list, cl_event event_ret) { if (mapped_ptr == NULL) return CL_INVALID_VALUE; diff --git a/include/cl_driver.h b/include/cl_driver.h index 38107e0e..d0ec7775 100644 --- a/include/cl_driver.h +++ b/include/cl_driver.h @@ -66,9 +66,9 @@ typedef struct _cl_driver { cl_int (*release_mem)(cl_mem mem, const cl_device_id device); cl_int (*enqueue_map_buffer)(cl_command_queue queue, cl_mem buffer, void** ret_addr, cl_bool block, cl_map_flags flags, size_t offset, size_t size, cl_uint num_events, const cl_event *event_list, - cl_event *event_ret); + cl_event event_ret); cl_int (*enqueue_unmap_mem)(cl_command_queue queue, cl_mem memobj, void *mapped_ptr, - cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event); + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event event_ret); cl_int (*enqueue_nd_range_kernel)(cl_command_queue queue, cl_kernel kernel, const uint32_t work_dim, const size_t *global_wk_off, const size_t *global_wk_sz, const size_t *local_wk_sz, cl_uint num_events, const cl_event *event_wait_list, cl_event event_ret); |