gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:53:06 28 4
gpt4 key购买 nike

OpenCV 有 gpu::Stream 类封装了一个异步调用队列。一些函数具有附加 gpu::Stream 参数的重载。除了 gpu-basics-similarity.cpp sample code ,OpenCV 文档中关于如何以及何时使用 gpu::Stream 的信息非常少。例如,我不太清楚 gpu::Stream::enqueueConvertgpu::Stream::enqueueCopy 到底做了什么,或者如何使用 gpu::Stream 作为额外的重载参数。我正在寻找一些类似教程的 gpu::Stream 概述。

最佳答案

默认情况下,所有 gpu 模块功能都是同步的,即当前 CPU 线程被阻塞,直到操作完成。

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

大多数 gpu 模块函数都有额外的 gpu::Stream范围。如果您传递非默认流,函数调用将是异步的,调用将被添加到流命令队列。

还有 gpu::StreamCPU<->GPU 之间的异步内存传输提供方法和 GPU<->GPU .但是CPU<->GPU异步内存传输仅适用于页面锁定的主机内存。还有一类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;

关于c++ - 如何在 OpenCV 中使用 gpu::Stream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17842827/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com