OpenCL 中的边界外检测

Out of boundary detection in OpenCL

本文关键字:检测 边界 OpenCL      更新时间:2023-10-16

我正在试验 OpenCL(C++ 接口),在没有注意到的情况下,我使用 10 而不是 10 * sizeof(int) 的缓冲区大小为 10 个整数创建了一个缓冲区,但代码显然运行没有问题。

现在,我相信这是可能的,因为我创建了带有CL_MEM_USE_HOST_PTR标志的缓冲区,这使得访问边界内存成为可能(尽管我不确定这一点)。

所以,我的问题是:是否可以在 OpenCL 中强制执行越界错误检查,以便报告给定区域的任何访问超大?

正如其他海报已经指出的那样,OpenCL 驱动程序目前不支持越界检查。虽然像WebCL验证器这样的工具在这方面很有前途,但我想提到另一条基于现有工具的道路,这在过去对我有帮助。通过使用 FreeOCL CPU 驱动程序,它依赖于标准的C++编译器来编译内核(在源到源的转换步骤之后),您可以在最终程序上使用像 valgrind 这样的工具,并获取如下所示的典型valgrind错误消息:

==5863== Thread 6:
==5863== Invalid write of size 1
==5863==    at 0xD61FA5D: __FCL_kernel_krnl_route_pkt (filehFymmN:27)

然后,您可以直接引用内核的C++版本(示例中/tmp/filehFymmN第 27 行)来查找发生违规操作的位置。

您可能想尝试WebCL验证器:https://github.com/KhronosGroup/webcl-validator

它是一个命令行工具,用于检测您的 OpenCL 内核源代码,并对越界内存访问进行运行时检查。它仍在进行中,因此任何反馈将不胜感激。

简短回答:否。

长答案:ATI和NVIDIA对于越界访问内存非常宽容,但英特尔会崩溃(尚未测试AMD CPU)。

对于像各向异性过滤器这样访问 n、n + 1 和 n - 1 的东西,您应该使用全局偏移量来避免越界访问内存,或者使用 if 语句签入内核。 全局偏移量很好,但 NVIDIA 不支持它,所以有它。

不幸的是,在主机代码上使用 try/catch 似乎也不起作用,因为您链接到的 OpenCL.dll 中正在执行魔法。

注意:这是在大约 4 个月前的 SDK 和代码上,如果从那时起它发生了变化,则不知道。