我的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