void GPUSort::Sort(CLBuffer &data) { CLEventList wait; CLEvent ev; local_sort_kernel_->SetIntArg(0, length_); local_sort_kernel_->SetBufferArg(1, &data); local_sort_kernel_->SetLocalBufferArg(2, local_sort_kernel_->work_group_size() * sizeof(cl_int)); local_sort_kernel_->Run1D(length_, NULL, &ev); CLBuffer *in = &data; CLBuffer *out = temp_buffer_.get(); for (int len = local_sort_kernel_->work_group_size(); len < length_; len *= 2) { wait.Clear(); wait.Add(ev); merge_sort_pass_kernel_->SetIntArg(0, length_); merge_sort_pass_kernel_->SetIntArg(1, len); merge_sort_pass_kernel_->SetBufferArg(2, in); merge_sort_pass_kernel_->SetBufferArg(3, out); merge_sort_pass_kernel_->Run1D(length_, &wait, &ev); swap(in, out); } if (in != &data) { wait.Clear(); wait.Add(ev); data.CopyFrom(*in, &wait, &ev); } ev.WaitFor(); }
XCamReturn cl_events_wait (CLEventList &event_list) { #define XCAM_MAX_CL_EVENT_COUNT 256 cl_event event_ids [XCAM_MAX_CL_EVENT_COUNT]; uint32_t event_count = 0; cl_int error_code = CL_SUCCESS; if (event_list.empty ()) return XCAM_RETURN_NO_ERROR; xcam_mem_clear (&event_ids); for (CLEventList::iterator iter = event_list.begin (); iter != event_list.end (); ++iter) { SmartPtr<CLEvent> &event = *iter; XCAM_ASSERT (event->get_event_id ()); event_ids[event_count++] = event->get_event_id (); if (event_count >= XCAM_MAX_CL_EVENT_COUNT) break; } XCAM_ASSERT (event_count > 0); error_code = clWaitForEvents (event_count, event_ids); XCAM_FAIL_RETURN ( WARNING, error_code == CL_SUCCESS, XCAM_RETURN_ERROR_CL, "cl events wait failed with error cod:%d", error_code); return XCAM_RETURN_NO_ERROR; }
uint32_t CLContext::event_list_2_id_array ( CLEventList &events_wait, cl_event *cl_events, uint32_t max_count) { uint32_t num_of_events_wait = 0; for (CLEventList::iterator iter = events_wait.begin (); iter != events_wait.end (); ++iter) { SmartPtr<CLEvent> &event = *iter; if (num_of_events_wait >= max_count) { XCAM_LOG_WARNING ("CLEventList(%d) larger than id_array(max_count:%d)", events_wait.size(), max_count); break; } XCAM_ASSERT (event->get_event_id ()); cl_events[num_of_events_wait++] = event->get_event_id (); } return num_of_events_wait; }