[英]OpenCL C++ Bindings: How to implement a callback for enqueueWriteBuffer competition
我刚刚开始使用 OpenCL 1.2 和 C++ 绑定。 我想将写入缓冲区异步排队并在操作完成后获得回调。 这是相关代码行的精简版本:
cl::Event enqueuingBufferReady;
auto error = enqueuingBufferReady.setCallback (CL_COMPLETE, [] (cl_event, cl_int, void*) { std::cout << "Enqueueing complete\n"; });
std::cout << "SetCallback return value: " << MyOpenCLHelpers::getErrorString (error) << std::endl;
// source is a std::vector<int>, buffer is a cl::Buffer of a matching size
commandQueue.enqueueWriteBuffer (buffer, CL_FALSE, 0, sizeof (int) * source.size(), source.data(), NULL, &enqueuingBufferReady);
//... execute the kernel - works successfully!
cl_int info;
enqueuingBufferAReady.getInfo (CL_EVENT_COMMAND_EXECUTION_STATUS, &info);
std::cout << "State of enqueuing " << MyOpenCLHelpers::getEventCommandExecutionStatusString (info) << std::endl;
什么工作:
内核成功执行并产生正确的结果。 缓冲区的入队应该有效。 程序以打印结束
State of enqueuing CL_COMPLETE
什么不起作用:
setCallback 调用返回
SetCallback return value: CL_INVALID_EVENT
永远不会调用回调。
那么这段代码有什么问题,如何将其更改为按预期工作?
与此同时,我自己发现了它。 我的错误是在将写入缓冲区入队之前设置回调。 正确的顺序是:
cl::Event enqueuingBufferReady;
// source is a std::vector<int>, buffer is a cl::Buffer of a matching size
commandQueue.enqueueWriteBuffer (buffer, CL_FALSE, 0, sizeof (int) * source.size(), source.data(), NULL, &enqueuingBufferReady);
auto error = enqueuingBufferReady.setCallback (CL_COMPLETE, [] (cl_event, cl_int, void*) { std::cout << "Enqueueing complete\n"; });
std::cout << "SetCallback return value: " << MyOpenCLHelpers::getErrorString (error) << std::endl;
只有在调用enqueueWriteBuffer
之后传入的cl::Event
有效并且随后的setCallback
调用起作用。 我对此有点困惑,因为我不确定如何保证在设置回调之前不会完成缓冲区的排队,但是我的测试表明这并不重要,因为如果回调甚至会被调用在操作完成后很久才设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.