2013-06-05 56 views
0

Ich有一個奇怪的問題。我剛開始使用openCL開發並實現了一個簡單的矩陣乘法:OpenCL任務掛在提交的

void MatrixMult(float *M, float *N, float *P, int width) { 
    cl_context context = core.getContext(); 
    cl_command_queue commandQueue = core.getCommandQueue(); 

    // create the kernel 
    cl_kernel kernel = core.createKernel("MatrixMultKernel"); 

    // reserve memory for i/o 
    int size = width * width * sizeof(float); 
    cl_mem Md = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, size, M, NULL); 
    cl_mem Nd = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, size, N, NULL); 
    cl_mem Pd = clCreateBuffer(context, CL_MEM_WRITE_ONLY , size, NULL, NULL); 

    // define kernel args 
    clSetKernelArg(kernel, 0, sizeof(cl_mem), &Md); 
    clSetKernelArg(kernel, 1, sizeof(cl_mem), &Nd); 
    clSetKernelArg(kernel, 2, sizeof(cl_mem), &Pd); 
    clSetKernelArg(kernel, 3, sizeof(int), &width); 

    // create kernel instances 
    size_t globalSize[] = {static_cast<size_t>(width), static_cast<size_t>(width)}; 
    cl_int kernelError = clEnqueueNDRangeKernel(commandQueue, kernel, 2, NULL, globalSize, NULL, 0, NULL, NULL); 
    if (kernelError != CL_SUCCESS) { 
     NSLog(@"Error executing kernel"); 
    } 

    // read back results 
    clEnqueueReadBuffer(commandQueue, Pd, false, 0, size, P, 0, NULL, &readEvent); 
    clSetEventCallback(readEvent, CL_COMPLETE, &eventCallback, NULL); 
} 

我的問題是回調從不被調用。我測試小型輸入應立即完成。

奇怪的是,每當我第二次調用函數(MatrixMult)時,回調就會觸發,因爲它應該如此。每次連續呼叫都是一樣的。當我檢查事件時,它不會觸發它總是有狀態CL_SUBMITTED。這裏發生了什麼?

回答

3

您可能需要在代碼的末尾添加對clFlush的調用。儘管OpenCL規範可能沒有明確列出這個要求,但我發現我的系統就是這種情況。它正在等待執行隱式clFlush的命令的clFlush。