在OpenCL中超出边界检测

时间:2013-10-28 14:18:25

标签: c++ opencl

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

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

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

3 个答案:

答案 0 :(得分:2)

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

这是一个命令行工具,可以通过运行时检查越界内存访问来检测OpenCL内核源代码。它仍在进行中,所以任何反馈都会非常感激。

答案 1 :(得分:2)

正如其他海报已经指出的那样,OpenCL驱动程序目前不支持越界检查。虽然像WebCL Validator这样的工具在这个领域很有前途,但我想提一下基于现有工具的另一条路径,它在过去帮助了我。通过使用依赖于标准C ++编译器来编译内核的FreeOCL CPU driver(在源到源转换步骤之后),您可以在最终程序中使用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行)来查找违规操作发生的位置。

答案 2 :(得分:1)

简答:不。

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

对于您正在访问n,n + 1和n - 1的各向异性过滤器,您应该使用全局偏移来避免访问内存超出范围或使用if语句检入内核。 Global Offset很不错,但是NVIDIA不支持它,所以就是这样。

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

注意:这是关于4个月大的SDK和代码,如果从那时起发生了变化,则为dunno。