gpt4 book ai didi

c++ - OpenCL C++ 绑定(bind) : How to implement a callback for enqueueWriteBuffer competition

转载 作者:行者123 更新时间:2023-12-01 14:50:19 25 4
gpt4 key购买 nike

我刚刚开始使用 OpenCL 1.2 和 C++ 绑定(bind)。我想将写入缓冲区异步排队并在操作完成后获取回调。这是相关代码行的精简版本:

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通话有效。我对此有点困惑,因为我不确定如何保证在设置回调之前将缓冲区入队不会完成,但是我的测试表明这无关紧要,因为即使调用了回调,如果它在操作已经完成很久之后设置。

关于c++ - OpenCL C++ 绑定(bind) : How to implement a callback for enqueueWriteBuffer competition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55492683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com