出于调试目的,我希望能够从内核中引出我选择的OpenCL错误。我的预期用例是使用此功能,如断言
__kernel void myKernel(...)
{
...
if(i < j){
InduceOpenCLError(-9999);
}
...
};
这是否可行,如果没有,是否有任何其他有用的方法来包含&#34;断言&#34;如果某个假设不成立,这显然会引发运行时错误?
这个问题是相关的,但略有不同: OpenCL: Manually throw an exception in kernel
答案 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内核中的错误对我来说绝对是一个痛点。