Opencl CL_OUT_OF_RESOURCES错误由具有动态并行性的ClenqueueEndRangeKernel()返回

Opencl CL_OUT_OF_RESOURCES错误由具有动态并行性的ClenqueueEndRangeKernel()返回,opencl,dynamic-parallelism,Opencl,Dynamic Parallelism,产生错误的内核代码: __kernel void testDynamic(__global int *data) { int id=get_global_id(0); atomic_add(&data[1],2); } __kernel void test(__global int * data) { int id=get_global_id(0); atomic_add(&data[0],2); if (id == 0) {

产生错误的内核代码:

__kernel void testDynamic(__global int *data)
{
    int id=get_global_id(0);
    atomic_add(&data[1],2);
}

__kernel void test(__global int * data)
{
    int id=get_global_id(0);
    atomic_add(&data[0],2);
    if (id == 0) {
        queue_t q = get_default_queue();
        ndrange_t ndrange = ndrange_1D(1,1);
        void (^my_block_A)(void) = ^{testDynamic(data);};
        enqueue_kernel(q, CLK_ENQUEUE_FLAGS_WAIT_KERNEL,
                       ndrange,
                       my_block_A);
    }

}
我测试了下面的代码,以确保OpenCL2.0编译器正常工作

__kernel void test2(__global int *data)
{
    int id=get_global_id(0);
    data[id]=work_group_scan_inclusive_add(id);
}
扫描函数将0,1,3,6作为输出,因此OpenCL2.0还原函数正在工作

动态并行是OpenCL2.0的扩展吗?如果我删除
enqueue_kernel
命令,结果等于预期值(忽略子内核)

设备:Amd RX550,驱动程序:17.6.2

是否需要在主机端运行一个特殊命令,以便在
get\u default\u queue
queue上运行子内核?目前,命令队列是使用OpenCL 1.2方式创建的,如下所示:

commandQueue = cl::CommandQueue(context, device, CL_QUEUE_PROFILING_ENABLE, &err);

get\u default\u queue()
是否必须是调用父内核的同一命令队列?问这个问题是因为我使用相同的命令队列将数据上传到GPU,然后在一次同步中下载结果。

将解决方案从问题移动到答案:

编辑:下面的API命令是解决方案:

commandQueue = cl::CommandQueue(context, device,
  CL_QUEUE_ON_DEVICE|
  CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | 
  CL_QUEUE_ON_DEVICE_DEFAULT, &err);
创建此队列(每个设备仅1个)后,未将其用于任何其他用途,并且父内核已在任何其他主机队列上排队,因此看起来get_default_queue()不必是父调用队列

文档说明,如果指定了\u设备上的CL\u QUEUE\u,则将抛出CL\u INVALID\u QUEUE\u属性,但对于我的计算机,动态并行处理它,并且不会抛出该错误(作为上面的commandQueue构造函数参数)


很好的回答,但我想补充一些事实:如果您在其他队列之前初始化该队列,您可能会遇到一些问题,如CL_无效命令_队列或0xC0000005退出代码。设备Amd RX550驱动程序25.20.15003.5010