2013-06-05 1 views
0

Ich ont un problème étrange. Je viens de commencer avec le développement OpenCL et mis en œuvre une simple multiplication matricielle:Les tâches OpenCL se bloquent à

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); 
} 

Mon problème est que le rappel est jamais appelé. Je teste avec de petites entrées qui devraient se terminer immédiatement.

L'étrange c'est à chaque fois que j'appelle la fonction (MatrixMult) une deuxième fois que le rappel se déclenche comme il se doit. La même chose pour chaque appel consécutif. Lorsque je vérifie l'événement alors qu'il ne se déclenche pas, il a toujours le statut CL_SUBMITTED. Qu'est-ce qui se passe ici?

Répondre

3

Vous devez probablement ajouter un appel à clFlush à la fin de votre code. Bien que la spécification OpenCL ne mentionne pas clairement cela comme une exigence, je trouve que c'est le cas sur mon système. Il attend soit clFlush d'une commande qui fait un clFlush implicite.

Questions connexes