1

私は奇妙な問題を抱えています。私は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) を 2 回目に呼び出すたびに、コールバックが正常に起動することです。連続するすべての呼び出しで同じこと。イベントが発生していないときにイベントを確認すると、ステータスは常に CL_SUBMITTED になります。ここで何が起こっているのですか?

4

1 に答える 1

3

おそらく、コードの最後に clFlush への呼び出しを追加する必要があります。OpenCL 仕様では要件として明確に記載されていない場合がありますが、私のシステムではそうであることがわかりました。暗黙の clFlush を実行するコマンドのいずれかの clFlush を待機しています。

于 2013-06-06T00:26:37.950 に答える