clEnqueueNDRangeKernel是否同步?

时间:2013-09-25 17:01:30

标签: opencl

以下代码不使用任何回调或clWaitForEvents,但它完美无缺。但我认为clEnqueueNDRangeKernel是非阻塞的。

void CL::executeApp1()
{
    cl_int status = 0;
    const int d1Size = 1024000;
    int* myInt = new int[d1Size];

    cl_mem mem1 = clCreateBuffer(context, 0, sizeof(int)*d1Size, NULL, &status);
    status = clEnqueueWriteBuffer(queue, mem1, CL_TRUE, 0, sizeof(int)*d1Size, myInt, 0, NULL, NULL);
    status = clSetKernelArg(kernel, 0, sizeof(cl_mem), &mem1);

    size_t global[] = {d1Size};
    cl_event execute;
    status = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global, NULL, 0, NULL, &execute);
    //clWaitForEvents(1, &execute);
    status = clEnqueueReadBuffer(queue, mem1, CL_FALSE, 0, sizeof(int)*d1Size, myInt, 0, NULL, NULL);

    string s = "";
    for(int i = 0; i < d1Size; i++)
    {
        s += to_string(myInt[i]);
        s += " ";
    }

    result = (char*)malloc(sizeof(char)*s.length());
    strcpy(result, s.c_str());
}

1 个答案:

答案 0 :(得分:1)

这是真的无阻塞。

但是,您只有1个队列,并且可能未设置为OUT_OF_ORDER_QUEUE。因此,它将按顺序运行所有内容。

首先是写入,然后是内核,最后是读取。 如果不使用两个队列进行IO和执行,则唯一需要阻塞的调用是readBuffer()。