Ответ 1
Вы правы в том, что ядро 3x3 не подходит для подхода на основе FFT. Лучшим способом справиться с этим было бы толкать ядро в постоянную память (или если вы используете карточку fermi +, это не должно иметь большого значения).
Поскольку вы знаете размер ядра, самым быстрым способом сделать это будет чтение фрагментов входного изображения/сигнала в разделяемую память и выполнение развернутой операции умножения и добавления.
-
Если вы хотите использовать библиотеки для выполнения этой операции ArrayFire и OpenCV имеют высоко оптимизированные подпрограммы Convolution, которые могут сэкономить вам много времени на разработку.
Я не очень хорошо знаком с OpenCV, но в ArrayFire вы можете сделать что-то вроде следующего.
array kernel = array(3, 3, h_kernel, afHost); // Transfer the kernel to gpu
array image = array(w, h, h_image , afHost); // Transfer the image to gpu
array result = convolve2(image, kernel); // Performs 2D convolution
ИЗМЕНИТЬ
Дополнительным преимуществом использования ArrayFire является его пакетная операция, позволяющая параллельно выполнять свертку. Вы можете прочитать о том, как convolvutions поддерживают пакетные операции над здесь
Например, если у вас было 10 изображений, которые вы хотите свернуть, используя одно и то же ядро, вы можете сделать что-то вроде следующего:
array kernel = array(3, 3, h_kernel, afHost); // Transfer the kernel to gpu
array images = array(w, h, 10, h_images, afHost); // Transfer the images to gpu
array res = convolve2(images, kernel); // Perform all operations simultaneously
-
Полное раскрытие информации: я работаю в AccelerEyes и активно работаю над ArrayFire.