C++ CUDA批量复制图像

C++ CUDA批量复制图像,c++,opencv,cuda,C++,Opencv,Cuda,我在一个目录中有5000多个图像。我想在两个图像之间执行图像比较。5000张图像的比较总数变为5000C2=12497500。 我在CUDA 10.1中使用OpenCV,但它比没有CUDA时慢。在我的理解中,主机到设备,反之亦然,传输是这里的瓶颈。 是否可以在一批100个图像阵列中传输图像,并最终在一次拍摄中获得结果?您可以使用cudaMemcpy传输任意数量的图像,但不会更快,因为传输速率相同,您只需跳过一点开销。此外,根据图像大小,这可能会超过您的GPU RAM 对于5000个图像,如果要

我在一个目录中有5000多个图像。我想在两个图像之间执行图像比较。5000张图像的比较总数变为5000C2=12497500。 我在CUDA 10.1中使用OpenCV,但它比没有CUDA时慢。在我的理解中,主机到设备,反之亦然,传输是这里的瓶颈。

是否可以在一批100个图像阵列中传输图像,并最终在一次拍摄中获得结果?

您可以使用
cudaMemcpy
传输任意数量的图像,但不会更快,因为传输速率相同,您只需跳过一点开销。此外,根据图像大小,这可能会超过您的GPU RAM

对于5000个图像,如果要将每个图像与其他图像进行比较,应检查CUDA中的计算是否弥补了复制时间。您确定的瓶颈是正确的,但在这种情况下,复制往往会超过并行计算的潜在加速,除非比较本身非常昂贵

要一次复制大块图像,必须将它们存储在连续的内存块中。一种简单(但也有点容易出错)的方法是将它们存储在一个大的整数数组中。假设我们有5张100*100px的RGB图像。3种颜色的每幅图像10000像素为每幅图像30.000个值。因此,对于5幅图像,我们需要存储150.000个值

int numberOfValues = 150000;
int size = numberOfValues * sizeof(int);
int *images = new int[numberOfValues];
// load 5 images into the array

int *deviceImages;
cudaMalloc((void**) &deviceImages, size;
cudaMemcpy(deviceImages, deviceImages, size, cudaMemcpyHostToDevice);
100个图像的代码除了值的数量外完全相同,但如前所述,根据图像和RAM的大小,您可能会遇到内存问题。如果您的图像有1000*1000像素,这更真实一些,对于100个图像(和三种颜色),您将需要300.000.000 int值,转换为1,2GB内存块和4字节整数


根据您的图像,您还可以使用
char
而不是
int
,这将使图像大小减少4。

您希望从CUDA中获得什么?如前所述,我希望通过将所有图像批量复制到设备内存中来减少NxN图像比较的时间消耗。您可以阅读有关流的信息,以及如何利用它们进行重叠计算和内存传输: