0

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

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

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

4

3 回答 3

2

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

它是一个命令行工具,通过运行时检查越界内存访问来检测您的 OpenCL 内核源代码。它仍在进行中,因此非常感谢任何反馈。

于 2013-10-28T22:10:30.320 回答
2

正如其他海报已经指出的那样,OpenCL 驱动程序当前不支持越界检查。虽然像 WebCL Validator 这样的工具在这个领域很有前景,但我想提一下基于现有工具的另一条路径,它过去曾帮助过我。通过使用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 行)来查找违规操作发生的位置。

于 2013-10-29T03:36:02.380 回答
1

简短的回答:没有。

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

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

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

注意:这是大约 4 个月前的 SDK 和代码,不知道从那以后它是否发生了变化。

于 2013-10-28T17:01:23.637 回答