OpenCL 中的边界外检测
Out of boundary detection in OpenCL
我正在试验 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 和代码上,如果从那时起它发生了变化,则不知道。
- 使用CMake检测支持的C++标准
- 当套接字连接断开时检测C/C++Unix
- C/C++预处理器是否可以检测一些编译器选项
- WMI检测进程创建事件-c++
- std::当在256字节边界上写入整数时,流的奇怪行为
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 下面是我为检测链接列表中的循环而制作的代码
- (中广)获取AABB树生成的边界立方体进行碰撞检测
- 多维边界框碰撞检测
- 检测不同颜色之间的边界
- 人脸检测期间的多个边界框
- OpenCV级联分类器检测输入Mat边界外的MultiScale结果Rect
- OpenCL 中的边界外检测
- 边界框碰撞检测算法
- 运行时边界数组的源级别检测有多困难
- 轴对齐边界框碰撞检测问题
- QGraphicsProxyWidget上奇怪的控件边界检测
- Regex检测边界,例如源代码行上的注释
- 使用边界框检测碰撞
- libcurl:检测块编码响应的块边界