一开始代码中这样写了:
cl::Context ctx = cl::Context(CL_DEVICE_TYPE_GPU, NULL);
cl::CommandQueue queue= cl::CommandQueue(ctx, devices[device_index],
CL_QUEUE_PROFILING_ENABLE, &err);
运行时发现运行正常,但是始终无法得到正确的结果。
找了另一个正常的例子逐个替换对象,最终发现这两个对象上面的赋值函数导致了问题。
因此,除非看了源码确认可以这么用,否则还是应该避免对象的值拷贝或者使用赋值函数。
很可能新对象虽然得到了所有内容,但是老对象析构后又导致新对象指向的内容出错。
修改为以下代码后正常:
cl::Context* ctx = new cl::Context(CL_DEVICE_TYPE_GPU, NULL);
cl::CommandQueue* queue = new cl::CommandQueue(ctx, devices[device_index],
CL_QUEUE_PROFILING_ENABLE, &err);
本文通过一个具体的OpenCL编程案例,揭示了在使用cl::Context和cl::CommandQueue对象时,直接赋值可能导致的问题。作者分享了在调试过程中发现,对象的赋值操作可能使新对象在老对象析构后指向无效内容,从而导致程序异常。通过将对象改为指针类型并进行初始化,问题得以解决。
766

被折叠的 条评论
为什么被折叠?



