我正在尝试使用 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 的输出,再次不起作用,我假设运行时发生了一些不好的事情,这真的让我感到困惑。
我发现出了什么问题,显然您还需要另一个队列,该队列与您用来调用生成其他内核的内核的队列分开,并且该队列必须专门使用 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 实际上并未明确用于启动任何内容,只需创建它即可。