繁体   English   中英

OpenCL C++ 绑定:如何为 enqueueWriteBuffer 竞争实现回调

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM