我正在尝试使用 OpenCL(C++ 接口),并且没有注意到它,我使用等于10
而不是 的缓冲区大小为 10 个整数创建了一个缓冲区10 * sizeof(int)
,但代码运行显然没有问题。
现在,我相信这是可能的,因为我创建了带有CL_MEM_USE_HOST_PTR
标志的缓冲区,这使得访问边界内存成为可能(尽管我不确定这一点)。
所以,我的问题是:是否可以在 OpenCL 中强制执行越界错误检查,以便报告任何超出给定区域的访问?
您可能想尝试 WebCL 验证器:https ://github.com/KhronosGroup/webcl-validator
它是一个命令行工具,通过运行时检查越界内存访问来检测您的 OpenCL 内核源代码。它仍在进行中,因此非常感谢任何反馈。
正如其他海报已经指出的那样,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 行)来查找违规操作发生的位置。
简短的回答:没有。
长答案:ATI 和 NVIDIA 对越界访问内存非常宽容,但英特尔会崩溃(尚未测试 AMD cpus)。
对于访问 n、n + 1 和 n - 1 的各向异性过滤器之类的东西,您应该使用全局偏移量来避免访问内存越界或使用if
语句检查内核。全局偏移很好,但 NVIDIA 不支持它,所以就是这样。
不幸的是,在主机代码上使用 try / catch 似乎也不起作用,因为在您链接到的 OpenCL.dll 中完成了魔法。
注意:这是大约 4 个月前的 SDK 和代码,不知道从那以后它是否发生了变化。