Ejemplo n.º 1
0
	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();
	}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}