Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CLENQUEUENDRANGE内核块执行_C++_Opencl - Fatal编程技术网

C++ CLENQUEUENDRANGE内核块执行

C++ CLENQUEUENDRANGE内核块执行,c++,opencl,C++,Opencl,我现在还有一个问题。我一直在尝试分析内核执行时的并行结果,而它被分解为多个调用。然而,虽然clEnqueueReadBuffer有一个布尔值来确定它是否阻塞,但ClenqueueEndRangeKernel没有,而且我一直假设它是异步的(毕竟它是“排队的”,这让我假设它会像任务队列一样工作)。然而,当我运行这段代码时,外部代码直到内核完全完成后才被执行(我没有显式调用clFinish或任何类似的操作会导致这种行为) 我正在NVidia GPU上运行内核。那么,为什么这段代码会被阻塞,我可以在Op

我现在还有一个问题。我一直在尝试分析内核执行时的并行结果,而它被分解为多个调用。然而,虽然clEnqueueReadBuffer有一个布尔值来确定它是否阻塞,但ClenqueueEndRangeKernel没有,而且我一直假设它是异步的(毕竟它是“排队的”,这让我假设它会像任务队列一样工作)。然而,当我运行这段代码时,外部代码直到内核完全完成后才被执行(我没有显式调用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;
const size_t amountPerGo=multipleRoundUp(local_ws,(int)(50000));
//查找大于50000段的本地工作大小的最小倍数

std::cout有可能同时执行OpenCL内核和参数设置。尝试使用不同的内核对象

您的命令队列是否设置为无序执行(CL\U queue\U out\U of order\U EXEC\U MODE\U ENABLE)默认情况下,它是有序队列。如您所示,它看起来像是API错误。EnqueuenRangeKernel从来不是阻塞调用。您是否可以使用事件检查队列调用后返回的事件是否已完成?不可能是事实。很好,当内核运行时,不可能设置内核参数。因此那里的阻塞调用是
setKernelArgs()
而不是
EnqueueNDRangeKernel()
。如果要为每次启动指定偏移量值,请在内核调用中使用offset参数,而不是通过参数传递。