OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
无匹配项
cv::cuda::BufferPool 类参考

用于 CUDA 流的 BufferPool更多…

#include <opencv2/core/cuda.hpp>

cv::cuda::BufferPool 的协作图

公有成员函数

 BufferPool (Stream &stream)
 获取给定流的 BufferPool
 
Ptr< GpuMat::AllocatorgetAllocator () const
 返回与流关联的分配器。
 
GpuMat getBuffer (int rows, int cols, int type)
 分配一个给定大小和类型的新 GpuMat
 
GpuMat getBuffer (Size size, int type)
 分配一个给定大小和类型的新 GpuMat
 

详细描述

用于 CUDA 流的 BufferPool

BufferPool 利用 Stream 的分配器为 GpuMat 创建新的缓冲区。只有在使用 setBufferPoolUsage 启用时才有效。

void setBufferPoolUsage(bool on)
BufferPool 管理(必须在创建 Stream 之前调用)
注意
必须在任何 Stream 声明 *之前* 调用 setBufferPoolUsage

用户可以为 Stream 指定自定义分配器,并可以实现他们自己的基于流的函数,这些函数利用相同的底层 GPU 内存管理。

如果未指定自定义分配器,BufferPool 默认使用 StackAllocator。StackAllocator 预先分配一块 GPU 设备内存,当稍后声明 GpuMat 时,它将获得预分配的内存。这种策略减少了对内存分配 API(如 cudaMalloc 或 cudaMallocPitch)的调用次数。

以下是一个使用带有 StackAllocator 的 BufferPool 的示例

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace cv::cuda
int main()
{
setBufferPoolUsage(true); // 告诉 OpenCV 我们将使用 BufferPool
setBufferPoolConfig(getDevice(), 1024 * 1024 * 64, 2); // 分配 64 MB,2 个栈(默认是 10 MB,5 个栈)
Stream stream1, stream2; // 每个流使用一个栈
BufferPool pool1(stream1), pool2(stream2);
GpuMat d_src1 = pool1.getBuffer(4096, 4096, CV_8UC1); // 16MB
GpuMat d_dst1 = pool1.getBuffer(4096, 4096, CV_8UC3); // 48MB,pool1 现在已满
GpuMat d_src2 = pool2.getBuffer(1024, 1024, CV_8UC1); // 1MB
GpuMat d_dst2 = pool2.getBuffer(1024, 1024, CV_8UC3); // 3MB
cvtColor(d_src1, d_dst1, cv::COLOR_GRAY2BGR, 0, stream1);
cvtColor(d_src2, d_dst2, cv::COLOR_GRAY2BGR, 0, stream2);
}
用于 CUDA 流的 BufferPool。
定义 cuda.hpp:741
具有引用计数的 GPU 内存的基本存储类。
定义 cuda.hpp:106
此类封装异步调用的队列。
定义 cuda.hpp:910
#define CV_8UC1
定义 interface.h:88
#define CV_8UC3
定义 interface.h:90
int getDevice()
返回由 cuda::setDevice 设置或默认初始化的当前设备索引。
void setBufferPoolConfig(int deviceId, size_t stackSize, int stackCount)
void cvtColor(InputArray src, OutputArray dst, int code, int dcn=0, Stream &stream=Stream::Null())
将图像从一种颜色空间转换为另一种颜色空间。
@ COLOR_GRAY2BGR
定义 imgproc.hpp:557
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 cuda.hpp:65
定义 core.hpp:107

如果我们在上述示例中为pool1分配另一个GpuMat,由于pool1的堆栈已满,它将由DefaultAllocator执行。

GpuMat d_add1 = pool1.getBuffer(1024, 1024, CV_8UC1); // pool1堆栈已满,内存由DefaultAllocator分配

如果在上述示例中声明第三个流,则在该流中使用getBuffer进行分配也将由DefaultAllocator执行,因为我们已用尽堆栈。

Stream stream3; // 只分配了2个堆栈,堆栈已用完
BufferPool pool3(stream3);
GpuMat d_src3 = pool3.getBuffer(1024, 1024, CV_8UC1); // 内存由DefaultAllocator分配
警告
使用StackAllocator时,释放顺序很重要。

就像堆栈一样,必须按照后进先出 (LIFO) 的顺序进行释放。下面是一个违反LIFO规则的错误使用示例。如果OpenCV在调试模式下编译,此示例代码将发出CV_Assert错误。

int main()
{
setBufferPoolUsage(true); // 告诉 OpenCV 我们将使用 BufferPool
Stream stream; // 为此流分配一个默认大小 (10 MB) 的堆栈
BufferPool pool(stream);
GpuMat mat1 = pool.getBuffer(1024, 1024, CV_8UC1); // 分配mat1 (1MB)
GpuMat mat2 = pool.getBuffer(1024, 1024, CV_8UC1); // 分配mat2 (1MB)
mat1.release(); // 错误用法:必须在mat1之前释放mat2
}
void release()
减少引用计数,当引用计数达到0时释放数据

由于C++局部变量的销毁顺序与构造顺序相反,因此下面的代码示例满足LIFO规则。局部GpuMat被释放,相应的内存将自动返回到池中以供以后使用。

int main()
{
setBufferPoolUsage(true); // 告诉 OpenCV 我们将使用 BufferPool
setBufferPoolConfig(getDevice(), 1024 * 1024 * 64, 2); // 分配 64 MB,2 个栈(默认是 10 MB,5 个栈)
Stream stream1, stream2; // 每个流使用一个栈
BufferPool pool1(stream1), pool2(stream2);
for (int i = 0; i < 10; i++)
{
GpuMat d_src1 = pool1.getBuffer(4096, 4096, CV_8UC1); // 16MB
GpuMat d_dst1 = pool1.getBuffer(4096, 4096, CV_8UC3); // 48MB,pool1 现在已满
GpuMat d_src2 = pool2.getBuffer(1024, 1024, CV_8UC1); // 1MB
GpuMat d_dst2 = pool2.getBuffer(1024, 1024, CV_8UC3); // 3MB
d_src1.setTo(Scalar(i), stream1);
d_src2.setTo(Scalar(i), stream2);
cvtColor(d_src1, d_dst1, cv::COLOR_GRAY2BGR, 0, stream1);
cvtColor(d_src2, d_dst2, cv::COLOR_GRAY2BGR, 0, stream2);
// 局部变量的销毁顺序为
// d_dst2 => d_src2 => d_dst1 => d_src1
// 满足LIFO规则,此代码运行无误
}
}
GpuMat & setTo(Scalar s)
将一些GpuMat元素设置为s(阻塞调用)
Scalar_< double > Scalar
定义 types.hpp:709

构造函数和析构函数文档

◆ BufferPool()

cv::cuda::BufferPool::BufferPool ( Stream & stream)
explicit
Python
cv.cuda.BufferPool(stream) -> <cuda_BufferPool object>

获取给定流的 BufferPool

成员函数文档

◆ getAllocator()

Ptr< GpuMat::Allocator > cv::cuda::BufferPool::getAllocator ( ) const
inline
Python
cv.cuda.BufferPool.getAllocator() -> retval

返回与流关联的分配器。

◆ getBuffer() [1/2]

GpuMat cv::cuda::BufferPool::getBuffer ( int rows,
int cols,
int type )
Python
cv.cuda.BufferPool.getBuffer(rows, cols, type) -> retval
cv.cuda.BufferPool.getBuffer(size, type) -> retval

分配一个给定大小和类型的新 GpuMat

◆ getBuffer() [2/2]

GpuMat cv::cuda::BufferPool::getBuffer ( Size size,
int type )
inline
Python
cv.cuda.BufferPool.getBuffer(rows, cols, type) -> retval
cv.cuda.BufferPool.getBuffer(size, type) -> retval

分配一个给定大小和类型的新 GpuMat

此函数的调用图如下所示

此类的文档是从以下文件生成的: