2013-09-25 90 views
0

以下代碼不使用任何回調函數或clWaitForEvents,但它完美地工作。但我認爲clEnqueueNDRangeKernel是非阻塞的。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()); 
} 
+0

如果您使用類型爲「in-order」的隊列並且只存在一個隊列,則非阻塞但順序同步。 –

回答

1

這就是非阻塞。

但是,您只有1個隊列,並且可能未設置爲OUT_OF_ORDER_QUEUE。所以,它會按順序運行一切。

先寫入,然後是內核,最後是讀取。 如果您不使用兩個隊列進行IO並執行,則需要阻止的唯一調用是readBuffer()。

+0

所以我們不能在設備上並行調用多個內核? –

+0

@Vishwadeep,你可以使用多個命令隊列。 – faken