这是否应该给出错误,如果是,如何检查它?(OpenCL)
Should this give an error, and if yes, how to check it? (OpenCL)
我正在学习在 OpenCL 中制作健壮的代码,并面对以下内核代码:
string kernel_code =
" void kernel simple_add(global const int *A, "
" global const int *B, "
" global int *C, int n) { "
" "
" int index = get_global_id(0); "
" C[index]=A[index]+B[index]; "
" } ";
并故意使用以下代码将其发送到 GPU:
Kernel ker(program, "simple_add");
ker.setArg(0, buffer_A);
ker.setArg(1, buffer_B);
ker.setArg(2, buffer_C);
ker.setArg(3, N);
q.enqueueNDRangeKernel(ker,NullRange,NDRange(32),NDRange(32));
q.finish();
问题是,我使用的工作项比需要的多,所以我认为我应该检查索引是否超出内核代码的范围。但我没有使用它,并且检查由 enqueueNDRangeKernel 或完成返回的错误给了我CL_SUCCESS。所以,或者由于某种原因这不应该给我错误,或者我不知道如何获得它们。答案是什么?
与 C 和 C++ 一样,在 OpenCL 中,数组中的越界是未定义的行为,因此它不一定会引发错误条件,但会导致几乎任何类型的奇怪行为。因此,不要依赖运行时来捕获此类编程错误。由于这种错误,而不是返回值中的错误代码,您的程序更有可能崩溃,甚至整个系统都会崩溃(如果它不使用 IOMMU)。
作为实现细节,您很可能会发现缓冲区以 4096 字节为增量映射到 GPU 的内存空间 - 一页内存。因此,如果您的越界访问仍在有效的 4096 字节页面中,则它的行为更有可能类似于典型的基于 CPU 的缓冲区溢出。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 使用std::vector的OpenCL矩阵乘法
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- 函数何时会在c++中包含stack_Unwind_Resume调用
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- Python中的for循环与C++有何不同
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- 这是否应该给出错误,如果是,如何检查它?(OpenCL)
- OpenCL:如何使用C++包装器检查构建错误