我有一个使用OpenCL 2.0的程序,因为我想利用设备端入队的优势。我有一个测试程序,可以在主机端执行以下任务:
masterKernel()
的内核masterKernel()
(heap
)的第一个参数设置为分配的内存masterKernel()
通过clEnqueueNDRangeKernel()
使work_dim
排队,{1}的全局工作量为1。(因此它只运行一次,get_global_id(0)
始终为零) 这是OpenCL代码:
//This function was stripped down to nothing for testing purposes.
kernel void childKernel(global float* heap)
{
}
//Enqueues the child kernel.
kernel void masterKernel(global float* heap)
{
ndrange_t ndRange = ndrange_1D(16); //Arbitrary, could be any number.
if(get_global_id(0) == 0)
{
enqueue_kernel(get_default_queue(), 0, ndRange,
^{ childKernel(heap); });
}
}
程序成功构建。但是,当我尝试运行masterKernel()
时,此处对enqueue_kernel()
的调用会导致对clEnqueueNDRangeKernel()
的主机端调用失败,错误代码为{{1 }}。 OpenCL的文档说CL_OUT_OF_RESOURCES
应该返回enqueue_kernel()
或CL_SUCCESS
,具体取决于块是否成功入队。它并不是说CL_ENQUEUE_FAILURE
本身应该失败。这是我尝试过的其他方法:
clEnqueueNDRangeKernel()
的调用会导致程序成功。enqueue_kernel()
设置为任意数字的行,将使主机端程序反映该更改。所以我知道我如何在其中输入参数不是问题heap[0]
语句,使其无法读取诸如if
still 之类的错误,从而导致错误。这告诉我该错误不是由if(get_global_id(0) == 6000)
执行(我验证了enqueue_kernel()
)引起的,而仅仅是它根本存在于程序中。get_global_size(0) == 1
语句修改为if
确实使错误不会发生。if(0)
实际上不会使错误消失。我不确定下一步该怎么做。我知道我的设备支持OpenCL 2.0。我的设备是AMD Radeon R9 380显卡。我无权使用其他任何具有OpenCL 2.0功能的硬件对其进行测试。
答案 0 :(得分:0)
我最终弄清楚了这个。发生此问题是因为我没有创建设备端队列(一个带有CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | CL_QUEUE_ON_DEVICE_DEFAULT
标志的队列)。