Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在OpenCV中使用gpu::Stream?_C++_Opencv_Gpgpu - Fatal编程技术网

C++ 如何在OpenCV中使用gpu::Stream?

C++ 如何在OpenCV中使用gpu::Stream?,c++,opencv,gpgpu,C++,Opencv,Gpgpu,OpenCV具有封装异步调用队列的gpu::Stream类。某些函数具有带有附加gpu::Stream参数的重载。除此之外,OpenCV文档中很少有关于如何以及何时使用gpu::Stream的信息。例如,(对我来说)不太清楚gpu::Stream::enqueueConvert或gpu::Stream::enqueueCopy到底做什么,或者如何使用gpu::Stream作为额外的重载参数。我正在寻找一些教程,如gpu::Stream的概述,默认情况下,所有gpu模块功能都是同步的,即当前CPU

OpenCV具有封装异步调用队列的
gpu::Stream
类。某些函数具有带有附加
gpu::Stream
参数的重载。除此之外,OpenCV文档中很少有关于如何以及何时使用
gpu::Stream
的信息。例如,(对我来说)不太清楚
gpu::Stream::enqueueConvert
gpu::Stream::enqueueCopy
到底做什么,或者如何使用
gpu::Stream
作为额外的重载参数。我正在寻找一些教程,如gpu::Stream的概述,默认情况下,所有gpu模块功能都是同步的,即当前CPU线程在操作完成之前被阻塞

gpu::Stream
cudaStream\u t
的包装器,允许使用异步非阻塞调用。您还可以阅读“CUDA C编程指南”,了解有关CUDA异步并发执行的详细信息

大多数gpu模块函数都有附加的
gpu::Stream
参数。如果传递非默认流,函数调用将是异步的,并且调用将添加到流命令队列中

另外,
gpu::Stream
提供了在
CPUGPU
GPUGPU
之间进行异步内存传输的方法。但是
CPUGPU
异步内存传输仅适用于页面锁定的主机内存。还有另一个类
gpu::CudaMem
封装了这样的内存

目前,如果同一操作使用不同的数据对不同的流排队两次,您可能会遇到问题。有些函数使用常量或纹理GPU内存,下一次调用可能会在上一次调用完成之前更新内存。但是异步调用不同的操作是安全的,因为每个操作都有自己的常量缓冲区。内存复制/上传/下载/设置对您持有的缓冲区的操作也是安全的

以下是小样本:

// allocate page-locked memory
CudaMem host_src_pl(768, 1024, CV_8UC1, CudaMem::ALLOC_PAGE_LOCKED);
CudaMem host_dst_pl;

// get Mat header for CudaMem (no data copy)
Mat host_src = host_src_pl;

// fill mat on CPU
someCPUFunc(host_src);

GpuMat gpu_src, gpu_dst;

// create Stream object
Stream stream;

// next calls are non-blocking

// first upload data from host
stream.enqueueUpload(host_src_pl, gpu_src);
// perform blur
blur(gpu_src, gpu_dst, Size(5,5), Point(-1,-1), stream);
// download result back to host
stream.enqueueDownload(gpu_dst, host_dst_pl);

// call another CPU function in parallel with GPU
anotherCPUFunc();

// wait GPU for finish
stream.waitForCompletion();

// now you can use GPU results
Mat host_dst = host_dst_pl;

谢谢因此,在您的示例中,gpu::Stream用于gpu上与CPU函数调用异步的函数调用。但是假设我有两个独立的函数(在GPU上)。我是否可以使用两个不同的gpu::Stream对象,以便这些函数在单个gpu上并行执行(类似于多线程)?何时可以使用多个流?是的,可以使用多个流。但是,正如我所说,如果从不同的流调用相同的函数,可能会遇到问题。这段代码如何有效?host_src_pl不是空的吗?
流。enqueueDownload
将为
host_dst_pl
分配内存。