C++ OpenCL segfaults,但给出了与GDB不同的错误
我有一个非常简单的OpenCL内核,我正在尝试运行它C++ OpenCL segfaults,但给出了与GDB不同的错误,c++,gdb,opencl,C++,Gdb,Opencl,我有一个非常简单的OpenCL内核,我正在尝试运行它 void kernel point_within(global const int* pointsX, global const int* pointsY, global int* center, global int* extents, global bool* output) { output[get_global_id(0)] = (abs(pointsX[get_global_id(0)] - center[0]) <=
void kernel point_within(global const int* pointsX, global const int* pointsY, global int* center, global int* extents, global bool* output) {
output[get_global_id(0)] = (abs(pointsX[get_global_id(0)] - center[0]) <= extents[0]) && \
(abs(pointsY[get_global_id(0)] - center[1]) < extents[1]);
};
如何调试此问题/问题是什么?您正在将未初始化的指针(
err
)传递给cl::Program
的构造函数,然后在错误测试中您没有取消引用它。初始化它,在测试中取消引用,然后删除它:
cl_int *err = new cl_int; // <-- initialize pointer
cl::Program program = cl::Program{context, devices, bin, &binaryStatus, err};
if(*err != CL_SUCCESS) { // <-- dereference pointer
// ....
}
delete err; // <-- release memory
另外,
buffer
需要在CreateProgramFromBinary
和CreateBinaryFromProgram
中释放:
cl_int err; // <-- not pointer
cl::Program{context, devices, bin, &binaryStatus, &err}; // <-- pass address
if(err != CL_SUCCESS) {
// ....
}
delete[] buffer; // <-- note `[]`
删除[]缓冲区;//嗯,根据堆栈跟踪,您的问题在于代码中“为了简洁”而省略的部分,特别是函数CreateProgramFromBinary
。此外,您传递的全局工作大小为0(cl::NullRange
),因此即使编译工作正常,内核也不会实际运行。OpenCL提供了一个相当健壮的错误报告机制,使用该机制,您甚至可以从运行时编译中检索输出日志(包括警告和错误)。一般来说,尤其是在跟踪故障时,应该检查每个OpenCL操作的错误值。@Pandora纠正了我的错误,我想我包括了这一部分。我还添加了它,我在玩改变各种变量的游戏。刚刚更新为全局工作大小为10,本地工作大小为2。还包括它发生故障的线路和功能。我想我确实检查了编译错误,但也许我做得不对?一个程序在gdb下正常运行时出现故障,通常是由于未初始化的变量或竞争条件造成的。我建议首先使用-g3编译程序,以获得出现问题的行。其次,使用Valgrind并检查错误。Valgrind将告诉您是否在未设置的情况下使用了任何内存地址。第三,如果Valgrind仍然让您有疑问,您可以在出现内存错误时使用Valgrind gdb server停止程序并进行调试。@cjds您是否调用了错误的函数?您已经添加了(两次)CreateBinaryFromProgram
,它似乎做了您想做的事情,但仍然没有CreateProgramFromBinary
,这是您错误的根源。@pandora犹豫我是个白痴。我做错事了。重新复制正确的一个如果你准备好了,我对@Trass3r链的下一步也有类似的问题,尽管当你需要一个C字符串时,这不太好。为什么不呢?嗯,你是对的。我仍然关注被调用方创建字符串并将其分配到容器中的情况,如cl::Program::getInfo
。
cl_int err; // <-- not pointer
cl::Program{context, devices, bin, &binaryStatus, &err}; // <-- pass address
if(err != CL_SUCCESS) {
// ....
}
delete[] buffer; // <-- note `[]`