Быстрая реализация 2D свертки?

Я сделал программу CUDA для 2D-свертки и теперь хочу сравнить ее с какой-либо реализацией, отличной от CUDA, чтобы измерить ускорение.

Я мог бы сравнить с моей собственной реализацией на простом C, используя классический подход с несколькими циклами или conv2 от Matlab, но это не похоже на законное/справедливое сравнение, поскольку они не являются самыми быстрыми реализациями.

Также я думал о том, чтобы попробовать OpenCV, и я безуспешно искал версию, оптимизированную для SIMD. Любой совет, я должен пойти с OpenCV?

ПРИМЕЧАНИЕ. Я читал другие вопросы, в том числе этот, но ответ в основном так же, как мой простой код C или обсуждение различных доступных методов.


person kirbuchi    schedule 03.06.2011    source источник


Ответы (1)


Самый быстрый общий алгоритм 2D-свертки сначала выполняет БПФ для источника, затем коррелирует, а затем возвращает БПФ, чтобы получить результат (что и делает conv2 в Matlab), поэтому ваш подход с несколькими циклами, вероятно, не самый лучший.

GSL предоставит вам стандартную и быструю реализацию БПФ, если вы хотите использовать это.

Кроме того, если ядро ​​является отделимым, вы можете сделать свертка как две одномерные свертки.

OpenCV великолепен, если он тоже работает, он должен быть широко принят как быстрая реализация.

person Pace    schedule 03.06.2011
comment
Хороший! Я понятия не имел о GSL, попытка реализации БПФ звучит как хорошая идея. Я думаю, что если я попробую свою программу как с OpenCV, так и с GSL, у меня будет довольно хорошее сравнение, так как я также тестировал Matlab. Спасибо, что помогаешь Пейсу! - person kirbuchi; 03.06.2011
comment
В зависимости от размера ядра БПФ не всегда выгоден (просто представьте себе ядро ​​1x1, тогда ясно, что БПФ/iFFT — это большие накладные расходы). Кроме того, я полностью согласен, но я бы рекомендовал библиотеку fftw для БПФ. Это то, что использует MATLAB, это самая распространенная библиотека сторонних поставщиков (я думаю), и она также должна быть ограничительной GNU GPL, а также iirc;) - person zerm; 10.06.2011
comment
Если кому-то интересно, я нашел действительно быструю реализацию. Он использует IPP, поэтому будет работать только с процессорами Intel, но, возможно, кому-то это поможет (matthewzeiler.com/software) - person kirbuchi; 09.07.2011