clEnqueueNDRangeKernel阻止执行

时间:2014-08-21 23:38:13

标签: c++ opencl

现在我的另一个问题。我一直试图分析我的内核与其执行并行的结果,同时它分解为多个调用。然而,虽然clEnqueueReadBuffer有一个布尔值来确定它是否阻塞,但clEnqueueNDRangeKernel没有,我认为它始终是异步的(它正在排队" afterall这让我觉得它会像任务一样队列)。但是,当我运行这段代码时,外部代码不会被执行,直到内核完全完成(我没有明确地调用clFinish或类似的东西会导致这种行为)。

我在NVidia GPU上运行内核。那么为什么这段代码会阻塞,我该怎么做才能在OpenCL中对其进行补救呢?否则,我正在考虑单独运行一个单独的线程来排队"这些内核命令到队列。

const size_t amountPerGo = multipleRoundUp(local_ws, (int)(50000));
//Finds the smallest multiple of local worksize that greater than the 50000 segment

std::cout << "Launch" << std::endl;

for( int j = 0; j < 10; j++ ) //Make the effects more extreme
{
    for( size_t i = 0; i < dimensions.x*dimensions.y; i+= amountPerGo )
    {
        clSetKernelArg(rayKernel, 6, sizeof(int), &i);
        std::cout << "sub" << std::endl;

        error = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &amountPerGo, &local_ws, 0, NULL, NULL);

        // Reading back
        clEnqueueReadBuffer(queue, outResult, CL_FALSE, sizeof(vec4)*i, sizeof(vec4)*(amountPerGo), resultSet+i, 0, NULL, NULL);
    }
}

std::cout << "End launch Start" << std::endl;

1 个答案:

答案 0 :(得分:1)

可以同时执行OpenCL内核&amp;参数设置。尝试使用不同的内核对象。