我的OpenCL程序并不总是在进一步执行主机(C++)代码之前完成。 OpenCL代码只能执行到某个点(它随机是随机的)。代码缩短了一些,所以可能会遗漏一些东西。等内核完成OpenCL
cl::Program::Sources sources;
string code = ResourceLoader::loadFile(filename);
sources.push_back({ code.c_str(),code.length() });
program = cl::Program(OpenCL::context, sources);
if (program.build({ OpenCL::default_device }) != CL_SUCCESS)
{
exit(-1);
}
queue = CommandQueue(OpenCL::context, OpenCL::default_device);
kernel = Kernel(program, "main");
Buffer b(OpenCL::context, CL_MEM_READ_WRITE, size);
queue.enqueueWriteBuffer(b, CL_TRUE, 0, size, arg);
buffers.push_back(b);
kernel.setArg(0, this->buffers[0]);
vector<Event> wait{ Event() };
版本1:
queue.enqueueNDRangeKernel(kernel, NDRange(), range, NullRange, NULL, &wait[0]);
版本2:
queue.enqueueNDRangeKernel(kernel, NDRange(), range, NullRange, &wait, NULL);
。
wait[0].wait();
queue.finish();
版本1只是不等待OpenCL程序。第2版崩溃的程序(在queue.enqueueNDRangeKernel):
异常在foo.exe的在0x51D99D09(nvopencl.dll)抛出:0000005:访问冲突读取位置0x0000002C。
如何让主机等待GPU在这里完成?
编辑:queue.enqueueNDRangeKernel返回-1000。虽然它在一个相当小的内核上返回0