OpenCL 动态并行 enqueue_kernel() 功能

问题描述 投票:0回答:1

我正在尝试使用 OpenCL 2.0 提供的功能从内核内部调用内核,但似乎无法使其工作。

例如我有这些内核:

__kernel void test2(){
    printf("test2");
}
__kernel void test1(){
    void (^my_func)(void) = ^{test2();};
    printf("test1");
    enqueue_kernel(get_default_queue(), CLK_ENQUEUE_FLAGS_NO_WAIT, ndrange_1D(1, 1), my_func);
}

然后我使用 :

调用 test1
    size_t globalWorkSize = 1;
    clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &globalWorkSize, NULL, 0, NULL, NULL);

但是看起来 test1 现在根本不执行, printf("test1");如果我注释掉 enqueue_kernel() 调用,它不会打印任何内容。内核编译没有错误,我使用“-cl-std=CL2.0”标志,非常奇怪。我缺少什么?预先感谢。

我在 Windows 上使用 7900XT 运行 AMD 3.0 OpenCL SDK。

如果我尝试声明一个 ndrange_t 变量,例如内核运行得很好,所以我假设一切都设置正确,但 enqueue_kernel 调用似乎阻碍了整个事情,因为在调用之前或之后没有执行任何其他操作。如果我尝试打印 enqueue_kernel 的输出,再次不起作用,我假设运行时发生了一些不好的事情,这真的让我感到困惑。

c++ c opencl gpgpu amd-gpu
1个回答
0
投票

我发现出了什么问题,显然您还需要另一个队列,该队列与您用来调用生成其他内核的内核的队列分开,并且该队列必须专门使用 clCreateCommandQueueWithProperties 创建,并且它需要具有适当的标志以允许队列打开设备。由于某种原因,没有错误代码表明该队列不存在,这就是为什么调试起来如此困难。

因此,例如添加以下行解决了我的问题:

cl_queue_properties properties[] = { CL_QUEUE_PROPERTIES, (cl_command_queue_properties)(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | CL_QUEUE_ON_DEVICE_DEFAULT), 0 };
cl_command_queue device_queue = clCreateCommandQueueWithProperties(context, device, properties, &err);

device_queue 实际上并未明确用于启动任何内容,只需创建它即可。

© www.soinside.com 2019 - 2024. All rights reserved.