У меня есть следующий код, который отлично работает при выборе Intel GPU в OSX.
cl::Buffer targetPtrBuffer = .. a valid OpenCL object
// CL Data
cl_buffer_region kernelRegion;
kernelRegion.origin = 0;
kernelRegion.size = sizeof(float) * 288*160;
cl::Buffer kernelBuffer = targetPtrBuffer.createSubBuffer(CL_MEM_READ_ONLY,
CL_BUFFER_CREATE_TYPE_REGION,
&kernelRegion);
int targetWidth = 288;
int targetHeight = 160;
cv::Mat empty = cv::Mat(cv::Size(targetWidth, targetHeight),CV_32FC1,cv::Scalar(0));
OpenCL::getInstance(upImpl->mGpuId)->getQueue().enqueueReadBuffer(kernelBuffer, CL_TRUE, 0,
sizeof(float) * targetWidth * targetHeight, &empty.at<float>(0));
OpenCL::getInstance(upImpl->mGpuId)->getQueue().finish();
op::log(std::to_string(cv::countNonZero(empty)));
Однако, когда я выбираю AMD GPU, createSubBuffer не работает, и я получаю пустой объект со всеми 0Это происходит только в OSX, отлично работает в Windows.Также на OSX он работает нормально с Intel GPU, но не работает на AMD GPU.