C++ 从硬盘读取灰度图像的最快方法

C++ 从硬盘读取灰度图像的最快方法,c++,image,opencv,cuda,C++,Image,Opencv,Cuda,我在GPU(CUDA)上从事图像处理工作。CUDA内核的输入是两个灰度8位图像(.tif)。它们必须作为1D阵列(基于0的行主存储)存储在GPU RAM内存中。处理时间约为24毫秒,因此阅读速度对我来说很重要。为了做到这一点,首先我需要将图像从HDD读取到CPU RAM内存(进入1d浮点数组),然后使用cudamemcpy将其复制到GPU RAM中。用C++ + HD/P>读取HDD的最快方法是什么? 我的图像是8位灰度1200x1600(大小1.92MB)。我编写了测试程序,可以读取大约250

我在GPU(CUDA)上从事图像处理工作。CUDA内核的输入是两个灰度8位图像(
.tif
)。它们必须作为1D阵列(基于0的行主存储)存储在GPU RAM内存中。处理时间约为24毫秒,因此阅读速度对我来说很重要。为了做到这一点,首先我需要将图像从HDD读取到CPU RAM内存(进入1d浮点数组),然后使用
cudamemcpy
将其复制到GPU RAM中。用C++ + HD/P>读取HDD的最快方法是什么? 我的图像是8位灰度1200x1600(大小1.92MB)。我编写了测试程序,可以读取大约250幅图像并测量时间:

使用matlab(
imread
),读取一幅图像的时间为
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);
image=imread(b,0);
图像转换到(img_float,CV_32F);
float*d=img_float.ptr(0);
在测试这个实现之后,我得到了更糟糕的结果:
8.8ms
。没有转换,它是
8.2ms
。通常
c++
比Matlab更快。有没有可能用C++实现峰值带宽,就像我用Matlab?

在C++中,我使用了代码>发布X64 < /C>模式,并进行了完全优化。通过
c++
中的函数
clock()
和matlab中的
tic-toc
测量读取250个不同图像的时间(并将其除以250,以找到每1个图像的时间)


谢谢

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

<> P> >你的问题“用C++来读取HDD的最快方法”的直接答案可能是“C++对HDD到RAM的数据传输速度几乎没有影响”。分配所需的内存量,并使用操作系统的本机API读取文件:您将获得最大内存

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


p.S.难道不能在GPU中转换图像吗?

这相当于~300 Mb/S,接近我的硬盘的峰值带宽。这超过了硬盘的峰值带宽,但对于SSD来说是合理的。SATA硬盘驱动器的最高速度约为200 MB/s。是的,我有SSD。我用独立软件测试了它,请试一下image=imread(b,-1);更快(无需更改即可加载图像)请记住,clock()测量cpu时间,而tic toc似乎测量墙壁时间,因此,如果cv::imread和.convertTo是多线程的,则在测量中会给它带来缺点!好啊已测试
按原样加载图像
(第二个参数=-1),这没有任何区别。测试了
cv::imread
的墙壁时间和cpu时间,两者也没有区别。您是否使用
debug
release
库?您好,谢谢您的回复。是的,我检查了图像是否正确加载到RAM中。是的,在Matlab中,您可以将图像读入您想要的任何类型的预分配数组中,转换将自动完成。我现在试着自己读一下。我没有找到可以将映像从SSD直接加载到GPU RAM的函数或库。