我正在尝试使用OpenCL(C ++接口),并且在没有注意到的情况下,我使用等于10
的缓冲区大小而不是10 * sizeof(int)
为10个整数创建了一个缓冲区,但代码运行时显然没有的问题。
现在,我相信这可能是可能的,因为我创建了带有CL_MEM_USE_HOST_PTR
标志的缓冲区,这使得访问超出边界内存成为可能(虽然我不确定)
所以,我的问题是:是否可以在OpenCL中强制执行越界错误检查,以便报告任何特定区域的访问权限?
答案 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。