【问题标题】:The fastest way of reading grayscale image from HDD从硬盘读取灰度图像的最快方法
【发布时间】:2015-03-22 00:56:31
【问题描述】:

我正在使用 GPU(CUDA)上的图像处理。 CUDA 内核的输入是两个灰度 8 位图像 (.tif)。它们必须在 GPU RAM 内存中作为一维数组(基于 0 的行主要存储)。处理时间约为 24ms,所以阅读速度对我来说很重要。为了做到这一点,首先我需要将图像从 HDD 读取到 CPU RAM 内存(到一维浮点数组),然后使用 cudamemcpy 将其复制到 GPU RAM 中。用c++从硬盘读取最快的方法是什么?

我的图像是 8 位灰度 1200x1600(大小 1.92 mb)。我编写了测试程序,读取大约 250 张图像并测量时间:

使用 matlab (imread) 读取 1 张图像的时间是 5.8ms。这对应于~300 Mb/s,接近我硬盘的峰值带宽。

但是,只要我使用 CUDA,我就需要使用 C++。我安装了OpenCV。不幸的是,我无法使用 OpenCV 将图像直接读入浮点数组。将其读入uchar 数组后,我将数据转换为浮点数组:

image = imread(b, 0);
image.convertTo(img_float, CV_32F);
float *d = img_float.ptr<float>(0);

在测试了这个实现之后,我得到了更糟糕的结果:8.8ms 每张图片。没有转换它是8.2 ms。通常c++ 更快,然后是 Matlab。是否可以像使用 Matlab 一样使用 c++ 实现峰值带宽?

附:在 c++ 中,我使用了 release x64 模式并进行了全面优化。读取 250 张不同图像的时间是通过 c++ 中的函数 clock() 和 matlab 中的 tic-toc 来测量的(除以 250 来计算每张图像的时间)。

谢谢

【问题讨论】:

  • 这相当于 ~300 Mb/s,接近我的 HDD 的峰值带宽。 这超过了硬盘驱动器的峰值带宽但对于 SSD 来说是合理的。 SATA 硬盘的最高速度约为 200 MB/s。
  • 是的,我有 SSD。我用独立的软件测试对其进行了测试
  • 请尝试是否 image = imread(b, -1);更快(无需更改即可加载图像)
  • 请注意,clock() 测量 cpu 时间,而 tic-toc 似乎测量墙时间,所以如果 cv::imread 和 .convertTo 是多线程的,那么你在测量中就会给它一个劣势!
  • ok... 测试了loaded image as is (2nd param = -1) 这没有任何区别。并测试了cv::imread 的 wall-time 与 cpu-time,这也没有什么区别。你使用debugrelease 库吗?

标签: c++ image opencv cuda


【解决方案1】:

有几点需要注意。首先:尝试验证您的基准测试是否真的正确。文件系统缓存会影响结果吗?如果是,请尝试使用更大的数据大小。您的基准测试是否测量了您真正打算测量的内容(即,MatLab 是否真的将图像转换为浮点数)?图像是否正确读取且没有错误?

直接回答您的问题“使用 c++ 从 HDD 读取数据的最快方法是什么?”可能是“C++(几乎)对从 HDD 到 RAM 的数据传输速度没有影响”。分配所需的内存量并使用操作系统的本机 API 读取文件:您将获得最大值。

可能重要的是 TIFF 图像处理库。尝试找出 OpenCV 使用什么库来处理 TIFF。它是否执行任何不必要的转换为一些中间表示或只是读取字节块?如果前者是真的,尝试寻找另一个库,甚至手动解析TIFF图像(如果没有压缩,解析TIFF没什么大不了的)。转换为浮点数可能不是瓶颈。 OpenCV 能够使用多线程(验证是否使用了所有 CPU 内核)和矢量化(您可以检查,也许通过查看执行转换的实际代码)。此外,如果您需要重复执行这些操作,请避免在循环中分配和释放内存:不要“就地”执行转换,而是使用两个单独的数组(一个用于 8 位图像,一个用于浮点) .

附:不可以在GPU中转换图片吗?

【讨论】:

  • 您好,感谢您的回复。是的,我检查了图像是否正确加载到 RAM 中。是的,在 Matlab 中,您可以将图像读取到您想要的任何类型的预分配数组中,并且转换将自动完成。我现在会尝试自己阅读。我没有找到可以直接将图像从 SSD 加载到 GPU RAM 的函数或库。
猜你喜欢
  • 2011-10-31
  • 2012-07-09
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 2014-06-13
相关资源
最近更新 更多