CUDA批量复制图像

问题描述 投票:-6回答:1

我在目录中有5000多张图片。我想在两个图像之间进行图像比较。 5000张图像的比较总数为5000C2 = 12,497,500。我正在使用OpenCV与CUDA 10.1,但它比没有CUDA慢。根据我的理解,主机到设备,反之亦然,这是一个瓶颈。 是否可以在一批100个图像阵列中传输图像,最终一次性获得结果?

c++ opencv cuda
1个回答
1
投票

您可以根据需要使用cudaMemcpy传输尽可能多的图像,但由于传输速率相同,因此速度不会明显,您只需略微开销。此外,根据图像大小,这可能会超过您的GPU RAM。

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

要一次复制大块图像,您必须将它们存储在一个连续的内存块中。一种简单(但也容易出错)的方法是将它们存储在一个大的整数数组中。假设我们有5张RGB图像,100 * 100px。每个图像10000像素,3种颜色,每个图像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值,转换为具有4个字节整数的1,2GB RAM块。

根据您的图像,您也可以使用char而不是int,这会将尺寸减小4。

© www.soinside.com 2019 - 2024. All rights reserved.