C++,OpenCV:异步运行 cuda::dft
Posted
技术标签:
【中文标题】C++,OpenCV:异步运行 cuda::dft【英文标题】:C++, OpenCV: run cuda::dft asynchronously 【发布时间】:2016-03-25 21:45:03 【问题描述】:我注意到 OpenCV 的函数 cv::cuda::dft
在传递流时也会同步运行。通常这意味着函数是异步执行的。但是,似乎 dft 函数调用了cudaFree
,这会导致同步行为。
有没有办法让它异步运行?
【问题讨论】:
您自己可以看到,在 dft 中没有明确调用 cudaFree :github.com/Itseez/opencv/blob/master/modules/cudaarithm/src/… 但是,只要我调用 dft,Nvidia Profiler 就会向我显示以前不存在的 cudaFree 调用,并且一切都开始变得同步。 在我看来,在某些情况下似乎在该函数中创建了新的 GpuMat。在这种情况下,它们将在作用域结束时被释放。 正如我在上一个问题上所说的那样。因此,请确定您的用例是否会触发这些代码路径并相应地修改您的代码以避免它们。或者编写您自己的 dft 实现,以避免在函数内触及内存分配或释放。我在这里没有看到 CUDA 编程问题,所以除非你能提供令人信服的理由,否则我会从这个问题中删除标签。 好的,我解决了这个问题。cv::cuda::dft
每次调用时都会创建和销毁一个计划。这引起了cudaFree
和cudaMalloc
的调用。使用 cufft 手动执行此操作,并且仅在循环解决问题之前创建一次计划。我想知道为什么他们不使用与 cudafilters 相同的方案,您首先创建过滤器,然后能够使用不同的输入和输出数据多次调用它。
【参考方案1】:
问题在于袖带计划的创建和破坏。函数cv::cuda::dft
每次调用它时都会执行此操作。当在循环中完成并导致同步调用时,这是非常低效的。目前似乎没有办法创建一个 dft 过滤器然后多次应用它,因为在 cudafilters 中您可以先创建一个过滤器,然后在不同的数据上多次应用它。
最后我通过不使用 OpenCV 的 dft 函数而是直接 cufft 解决了这个问题。然后我可以在循环之前创建一个计划,在循环内使用该计划执行我的 ffts,然后在循环之后将其销毁。
【讨论】:
以上是关于C++,OpenCV:异步运行 cuda::dft的主要内容,如果未能解决你的问题,请参考以下文章
在 OpenCV (C++) 中使用 calcHist 的运行时错误