OpenCL任务在提交时挂起

OpenCL任务在提交时挂起,opencl,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 = c

我有一个奇怪的问题。我刚开始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);
}
void矩阵结果(float*M、float*N、float*P、int-width){
cl_context context=core.getContext();
cl_command_queue commandQueue=core.getCommandQueue();
//创建内核
cl_kernel kernel=core.createKernel(“MatrixMultKernel”);
//为i/o保留内存
int size=width*width*sizeof(float);
cl_mem Md=clCreateBuffer(上下文,cl_mem_READ_ONLY | cl_mem_COPY_HOST_PTR,size,M,NULL);
cl_mem Nd=clCreateBuffer(上下文,cl_mem_READ_ONLY | cl_mem_COPY_HOST_PTR,size,N,NULL);
cl_mem Pd=clCreateBuffer(上下文,仅cl_mem_WRITE_,size,NULL,NULL);
//定义内核参数
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);
//创建内核实例
大小\u t globalSize[]={static\u cast(宽度),static\u cast(宽度)};
cl_int kernelError=clenqueueendrangekernel(commandQueue,kernel,2,NULL,globalSize,NULL,0,NULL,NULL);
if(kernelError!=CL_SUCCESS){
NSLog(@“执行内核时出错”);
}
//读回结果
clenqueueredbuffer(commandQueue、Pd、false、0、size、P、0、NULL和readEvent);
clSetEventCallback(readEvent,CL_COMPLETE,&eventCallback,NULL);
}
我的问题是从未调用回调。我使用小输入进行测试,应该立即完成


奇怪的是,每当我第二次调用函数(MatrixMult)时,回调就会按其应该的方式触发。每次连续通话都是一样的。当我在事件未触发时检查事件时,它的状态始终为CL_SUBMITTED。这是怎么回事?

您可能需要在代码末尾添加对clFlush的调用。虽然OpenCL规范可能没有明确列出这一要求,但我发现在我的系统中就是这样。它正在等待执行隐式clFlush的命令的clFlush