如何将OpenCL gpu内存映射到OpenCV矩阵?

问题描述 投票:0回答:1

我用OpenCL在gpu上计算了一些矩阵,现在我需要使用OpenCV对它进行一些过滤。我怎样才能以最少的开销做到这一点?

cl::Buffer buffer;
cl::Kernel kernel;
kernel = cl::Kernel(program, "functionName", &err);
buffer = cl::Buffer(context, CL_MEM_READ_WRITE, size, NULL, &err);
kernel.setArg(0, buffer);
queue_IQ.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(size), cl::NullRange, NULL, NULL);

// Here, I would like to map the content of buffer to cv::Mat.
opencv opencl
1个回答
1
投票

它可以用很少的开销实现这样的目的:

  1. 将gpu内存映射到指针(在我的例子中为float *)。
  2. 使用此指针创建opencv矩阵。注意,opencv矩阵构造函数不会为指针复制或分配新内存,而是将矩阵头初始化为指向指定数据(在本例中为gpu)。

例如,如果您正在使用浮点数:

// cl::Buffer buffer
float* dataOnGPU = static_cast<float *>(queue_IQ.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, dataSize, NULL, NULL, NULL)); // map GPU memory to float*
cv::Mat dataInMat(height, width, CV_32F, dataOnGPU); // interface float* with cv::Mat

...

// Once done, you can unmap
queue_IQ.enqueueUnmapMemObject(buffer, dataOnGPU, NULL, NULL);

有关详细信息,请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.