【问题标题】:cudaMemcpy image data with conversion from HWC to CHW从 HWC 转换为 CHW 的 cudaMemcpy 图像数据
【发布时间】:2021-12-30 23:06:26
【问题描述】:

假设我们有一些 OpenCV 常用的图像 Mat:

cv::Mat usual_image = cv::imread(...)

此图像作为 HWC/NHWC 数组存储在内存中。

如果可以将此图像作为 CHW/NCHW(从某种意义上说是分离的通道阵列)复制到 cuda 内存中而无需超高成本 cv::split?

仅用于可视化 HWC 和 CHW:

【问题讨论】:

  • 可能。 cv::split 是 cpu 端,因此很慢。 afaik 有cv::cuda::split(设备端),它应该便宜很多,而且可能还有办法在传输期间进行转换。一些相关的配方:stackoverflow.com/questions/41637162/…answers.opencv.org/question/191013/…——当你使用 opencv 的 dnn 模块时,它有各种“blob”方法可以解决这个问题
  • 如果你有预分配的内存在你想写的地方,cv::cuda::split 会比cpu 版本更差。因为中间会存在cudamemalloc,开销很大。

标签: opencv image-processing cuda


【解决方案1】:

执行此操作的最快方法是将图像原样复制到 GPU,然后 write a GPU kernel 将数据拆分为 3 个缓冲区。

较慢的替代方法是使用 3 callscudaMemcpy2D 将数据从主机复制到设备,每个平面调用一次。

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 2020-10-29
    • 2012-08-26
    • 2018-05-30
    • 2017-04-24
    • 1970-01-01
    • 2015-02-11
    • 2021-01-08
    • 2021-01-22
    相关资源
    最近更新 更多