Быстрая реализация 2D свертки? - PullRequest
3 голосов
/ 03 июня 2011

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

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

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

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

1 Ответ

5 голосов
/ 03 июня 2011

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

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

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

OpenCV отлично подходит, если он тоже работает, его следует широко использовать как быструю реализацию.

...