diff options
Diffstat (limited to 'libclapi/cl_kernel.c')
-rw-r--r-- | libclapi/cl_kernel.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/libclapi/cl_kernel.c b/libclapi/cl_kernel.c index 0f110bef..b0853536 100644 --- a/libclapi/cl_kernel.c +++ b/libclapi/cl_kernel.c @@ -773,7 +773,10 @@ static cl_int cl_command_queue_ND_range(cl_command_queue queue, cl_kernel kernel const cl_event *event_wait_list, cl_event *event_ret) { cl_event event = NULL; + cl_command_queue_work_item it = NULL; cl_int err = CL_SUCCESS; + uint32_t i; + cl_int ret_status; if (event_ret) { event = cl_create_event(queue->ctx, queue, CL_FALSE, num_events_in_wait_list, event_wait_list, &err); @@ -781,21 +784,46 @@ static cl_int cl_command_queue_ND_range(cl_command_queue queue, cl_kernel kernel goto error; } - uint32_t i; + it = cl_enqueue_create_work_item(queue, num_events_in_wait_list, event_wait_list, event); + if (it == NULL) { + err = CL_OUT_OF_HOST_MEMORY; + goto error; + } + CL_MUTEX_LOCK(&kernel->lock); for (i = 0; i < kernel->arg_num; ++i) if (kernel->args[i]->is_set == CL_FALSE) { - return CL_INVALID_KERNEL_ARGS; + err = CL_INVALID_KERNEL_ARGS; CL_MUTEX_UNLOCK(&kernel->lock); + goto error; } CL_MUTEX_UNLOCK(&kernel->lock); err = queue->device->driver->enqueue_nd_range_kernel(queue, kernel, work_dim, global_wk_off, - global_wk_sz, local_wk_sz, num_events_in_wait_list, event_wait_list, event); + global_wk_sz, local_wk_sz, it); if (err != CL_SUCCESS) { goto error; } + /* If no events depend, we submit it immediately. */ + if (event_wait_list == NULL) { + ret_status = cl_enqueue_submit_work_item(queue, it); + if (ret_status < 0) { + /* We consider it as a error and return fail. */ + err = CL_OUT_OF_RESOURCES; + goto error; + } + if (ret_status > CL_COMPLETE) { + err = cl_enqueue_insert_work_item(queue, it); + if (err != CL_SUCCESS) + goto error; + } + } else { + err = cl_enqueue_insert_work_item(queue, it); + if (err != CL_SUCCESS) + goto error; + } + if (event_ret) *event_ret = event; @@ -814,6 +842,8 @@ static cl_int cl_command_queue_ND_range(cl_command_queue queue, cl_kernel kernel return err; error: + if (it) + cl_enqueue_destroy_work_item(queue, it); if (event) cl_release_event(event); return err; |