是否可以从 OpenCL 内核中引入用户定义的错误?

Can one induce a user-defined error from an OpenCL kernel?

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

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

这是否可能,如果不可能,是否有任何其他有用的方法来包含 "assertion" 如果某个假设不正确,这显然会导致运行时错误?

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

不幸的是,这是 OpenCL 中缺少的东西。正如您提到的问题所建议的那样,您确实有 printf 来报告错误,但即使那样也有点笨拙并且无法帮助您以编程方式检测错误。

如果您真的想要返回错误代码,我可以想到几个选项(none 简单)。

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

#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 内核中缺乏指示错误的有效方法对我来说也是一个痛点。