Я только начинаю с OpenCL 1.2 и C ++ Bindings. Я хочу поставить в буфер записи асинхронный и получить обратный вызов после завершения операции. Вот урезанная версия соответствующих строк кода:
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
Обратный вызов никогда не вызывается.
Так что же не так с этим фрагментом кода и как его можно изменить, чтобы он работал как задумано?