OpenCL enqueueReadBuffer возвращает код ошибки -38 CL_INVALID_MEM_OBJECT (macOS) - PullRequest
2 голосов
/ 18 февраля 2020

Я пишу простую программу OpenCL на C ++. Эта программа устанавливает для массива, передаваемого в ядро, значение «Hello». Эта программа отлично работает на моем компьютере Windows 10 с NVIDIA Quadro P620, но не работает на моем Macbook Pro с Intel Iris Graphics 6100, работающей на macOS Catalina. На macOS программа работает без ошибок, пока я не вызову enqueueReadBuffer, который возвращает код ошибки -38 CL_INVALID_MEM_OBJECT. На обеих машинах он работает на OpenCL 1.2. У вас есть опыт или предложения о том, как заставить его корректно работать на macOS?

void Hello() {
   std::vector<cl::Platform> platforms;
   cl::Platform::get(&platforms);

   auto platform = platforms.front();
   std::vector<cl::Device> devices;
   platform.getDevices(CL_DEVICE_TYPE_GPU, &devices);

   auto device = devices.front();
   auto vendor = device.getInfo<CL_DEVICE_VENDOR>();
   auto name = device.getInfo<CL_DEVICE_NAME>();
   auto version = device.getInfo<CL_DEVICE_VERSION>();

   std::string source = R"(__kernel void Hello(__global char* A) {
A[0] = 'H';
A[1] = 'E';
A[2] = 'L';
A[3] = 'L';
A[4] = 'O';
A[5] = '\0';
})";

   cl::Program::Sources sources({ std::make_pair(source.c_str(), source.size() + 1) });
   cl::Context context(device);
   cl::Program program(context, sources);

   auto error = program.build(devices);

   // array process
   char data[6];

   cl::Buffer buffer(context, CL_MEM_READ_WRITE, sizeof(data), &error);
   cl::CommandQueue queue(context, device);
   cl::Kernel kernel(program, "Hello", &error);
   error = kernel.setArg(0, buffer);
   error = queue.enqueueTask(kernel);
   error = queue.enqueueReadBuffer(buffer, CL_TRUE, 0, sizeof(data), data);
   std::cout << data << "\n";
} 
...