设备端排队导致CL_OUT_OF_RESOURCES

时间:2020-04-10 04:10:47

标签: opencl gpgpu amd

我有一个使用OpenCL 2.0的程序,因为我想利用设备端入队的优势。我有一个测试程序,可以在主机端执行以下任务:

  1. 在设备上分配16 KB的浮点内存并将其清零。
  2. 在下面构建OpenCL程序,并创建masterKernel()的内核
  3. 在步骤1中将masterKernel()heap)的第一个参数设置为分配的内存
  4. 通过masterKernel()通过clEnqueueNDRangeKernel()使work_dim排队,{1}的全局工作量为1。(因此它只运行一次,get_global_id(0)始终为零)
  5. 将内存读回主机并显示。

这是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功能的硬件对其进行测试。

1 个答案:

答案 0 :(得分:0)

我最终弄清楚了这个。发生此问题是因为我没有创建设备端队列(一个带有CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | CL_QUEUE_ON_DEVICE_DEFAULT标志的队列)。

相关问题