Я пишу простую программу 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";
}