在OSX上选择Intel GPU时,我有以下代码可以完美工作。
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上无法工作。