可以从OpenCL内核中引发用户定义的错误吗?

时间:2015-03-16 14:48:17

标签: opencl

出于调试目的,我希望能够从内核中引出我选择的OpenCL错误。我的预期用例是使用此功能,如断言

__kernel void myKernel(...)
{
  ...
  if(i < j){
    InduceOpenCLError(-9999);
  }
  ...
};

这是否可行,如果没有,是否有任何其他有用的方法来包含&#34;断言&#34;如果某个假设不成立,这显然会引发运行时错误?

这个问题是相关的,但略有不同: OpenCL: Manually throw an exception in kernel

1 个答案:

答案 0 :(得分:1)

不幸的是,这是OpenCL缺少的。正如您引用的问题所示,您确实有printf报告错误,但即使这样也很笨拙,并且无法帮助您以编程方式检测错误。

如果您确实设置了返回错误代码,我可以考虑几个选项(不容易)。

首先,您可以传递缓冲区以包含每个工作项的所有状态值。运行内核后,您需要通过主机代码检查值。您可以有条件地包含此代码,如下所示仅用于调试。 (以下是完全未经测试的。)

#ifndef RETURN_STATUSES
#define RETURN_STATUS(S) \
  do { \
    _kernel_status[get_global_id(0)] = (S); \
    return; \
  } while (0)
#else
#define RETURN_STATUS(S) return
#endif

kernel void myKernel(
  ... normal args
#ifdef RETURN_STATUSES
  , global int *_kernel_status
#endif
  )
{
  ...
  if (i < j) {
    RETURN_STATUS(-9999);
  }
}

另一种选择可能是以原子方式设置单个值。同样,这会对性能产生重大影响,仅适用于调试。

缺乏一种有效的方法来指示OpenCL内核中的错误对我来说绝对是一个痛点。