CUDA пакетное копирование изображений - PullRequest
0 голосов
/ 28 апреля 2019

У меня более 5000 изображений в каталоге. Я хочу выполнить сравнение изображений между двумя изображениями. Общее количество сравнений для 5000 изображений становится 5000 C 2 = 12 497 500. Я использую OpenCV с CUDA 10.1, но это медленнее, чем без CUDA. В моем понимании узкое место здесь - хост-устройство и наоборот.
Можно ли передавать изображения в серии из 100 массивов изображений и, наконец, получить результат за один снимок?

1 Ответ

1 голос
/ 29 апреля 2019

Вы можете передавать столько изображений с помощью cudaMemcpy, сколько пожелаете, но это не станет заметным быстрее, потому что скорость передачи такая же, просто пропустите немного накладных расходов. Кроме того, в зависимости от размера изображения это может превышать объем ОЗУ вашего графического процессора.

Для 5000 изображений, если вы хотите сравнить каждое изображение с любым другим изображением, вам следует проверить, соответствует ли расчет в CUDA времени копирования. Вы определили узкое место как правильное, но в подобных случаях копирование имеет тенденцию перевешивать потенциальное ускорение параллельных вычислений, если только само сравнение не является очень дорогим.

Для одновременного копирования больших фрагментов изображений их необходимо хранить в непрерывном фрагменте памяти. Простой (но также немного подверженный ошибкам) ​​способ сделать это - сохранить их в большом массиве целых чисел. Допустим, у нас есть 5 изображений RGB с разрешением 100 * 100 пикселей. 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 изображений точно такой же, за исключением количества значений, но, как уже было отмечено, у вас могут возникнуть проблемы с памятью, в зависимости от вашего образа и объема ОЗУ. Если ваши изображения имеют 1000 * 1000 пикселей, что немного более реалистично, для 100 изображений (и трех цветов) вам потребуется 300 000 000 int-значений, что переводится в 1,2 ГБ оперативной памяти с 4-байтовыми целыми числами.

В зависимости от ваших изображений, вы также можете использовать char вместо int, что уменьшит размер на 4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...