为什么不允许cudaLaunchCooperativeKernel()返回?

为什么不允许cudaLaunchCooperativeKernel()返回?,cuda,dynamic-parallelism,gpu-cooperative-groups,Cuda,Dynamic Parallelism,Gpu Cooperative Groups,因此,我使用GTX 1050,计算能力为6.1,CUDA 11.0。我需要在我的程序中使用网格同步,因此需要cudaLaunchCooperativeKernel()。我已经检查了我的设备查询,因此GPU确实支持协作组。我无法执行以下功能 extern "C" __global__ void test(int x) { if (x) { printf("%d", x); if (threadIdx.x == 0)

因此,我使用GTX 1050,计算能力为6.1,CUDA 11.0。我需要在我的程序中使用网格同步,因此需要
cudaLaunchCooperativeKernel()
。我已经检查了我的设备查询,因此GPU确实支持协作组。我无法执行以下功能

 extern "C" __global__ void test(int x) {
    if (x) {
       printf("%d", x);
       if (threadIdx.x == 0)
          test<<<1, 1>>>(--x);
    }
}

获取错误“不允许操作”(代码为800)。现在,当设备不支持协作组时(在本例中不支持),将返回此消息。那么,是什么导致了这个问题呢?

您的内核使用了动态并行。 但是,通过
cudaLaunchCooperativeKernel


运行时API的文档中提到了这一点

内核利用了动态并行性。 但是,通过
cudaLaunchCooperativeKernel


运行时API的文档中提到了这一点

我明白了!在我的例子中,网格同步有什么解决方法吗?我认为网格同步的唯一解决方法是有两个内核,一个用于同步前的部分,一个用于同步后的部分。我明白了!那么,在我的例子中,网格同步有什么解决方法吗?我认为网格同步的唯一解决方法是使用两个内核,一个用于同步之前的部分,一个用于同步之后的部分。
cudaLaunchCooperativeKernel((void *)test, 1, 1, (void **) (&x));