Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCL segfaults,但给出了与GDB不同的错误_C++_Gdb_Opencl - Fatal编程技术网

C++ OpenCL segfaults,但给出了与GDB不同的错误

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]) <=

我有一个非常简单的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]) <= 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 `[]`