是否可以从 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 内核中缺乏指示错误的有效方法对我来说也是一个痛点。
出于调试目的,我希望能够从内核中引入我选择的 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 内核中缺乏指示错误的有效方法对我来说也是一个痛点。