Как лучше всего улучшить время выполнения алгоритма бикубической интерполяции? - PullRequest
2 голосов
/ 28 января 2011

Я разрабатываю некоторое программное обеспечение для обработки изображений на C ++ для Intel, которое должно многократно запускать алгоритм бикубической интерполяции для маленьких (около 1kpx) изображений.Это занимает много времени, и я стремлюсь ускорить его.Теперь у меня есть базовая реализация, основанная на литературных источниках, несколько улучшенная (в отношении скорости) версия, которая не выполняет умножение матриц, а использует предварительно вычисленные формулы для частей интерполирующего полинома и, наконец, фиксированныйверсия кода умножения матриц (на самом деле работает медленнее).У меня также есть внешняя библиотека с оптимизированной реализацией, но она все еще слишком медленная для моих нужд.Далее я рассмотрел следующее:

  • векторизация с использованием обработки потока MMX / SSE как в версиях с плавающей, так и с фиксированной точкой
  • , выполняющих интерполяцию в области Фурье с использованием свертки
  • перенос работы на GPU с использованием OpenCL или аналогичного

Какой из этих подходов может дать наибольший прирост производительности?Не могли бы вы предложить другой?Спасибо.

Ответы [ 4 ]

5 голосов
/ 28 января 2011

Я думаю, что GPU - это путь. Это, наверное, самая естественная задача для этого типа оборудования. Я бы начал с изучения CUDA или OpenCL . Более старые методы, такие как простые пиксельные / фрагментные шейдеры DirectX / OpenGL, также должны хорошо работать.

Некоторые ссылки, которые я нашел, может быть, они могут вам помочь:

3 голосов
/ 28 января 2011

Будьте осторожны при прохождении маршрута GPU. Если ваше ядро ​​свёртки слишком быстрое, вы в конечном итоге будете связаны с IO. Вы не будете знать наверняка, какой из них самый быстрый, если вы не реализуете оба.

В графическом процессоре Gems 2 есть глава Быстрая фильтрация текстур третьего порядка , которая должна стать хорошей отправной точкой для вашего графического решения.

Сочетание Intel Threading Building Blocks и инструкций SSE позволит получить достойное решение для ЦП.

3 голосов
/ 28 января 2011

Есть библиотеки Intel IPP , которые используют SIMD для ускорения обработки.Intel IPP также использует OpenMP, если он настроен, вы можете воспользоваться сравнительно простой многопроцессорной обработкой.

Эти библиотеки поддерживают бикубическую интерполяцию и являются платными (вы покупаете лицензию на разработку, но перераспределение бесплатное).

0 голосов
/ 04 февраля 2011

Не ответ для бикубического, но, возможно, альтернатива:
если я вас понимаю, у вас есть 32 x 32 xy, 1024 x 768 изображений, и вы хотите интерполировать image[xy].
Просто округлить xy, image[ int( xy )], было бы слишком зернистым.
Но подождите - вы могли бы сделать сглаженное двойное изображение 2k x 1.5k, один раз и взять
image2[ int( 2*xy )]: менее зернистое, очень быстрое.Или, аналогично,
image4[ int( 4*xy )] в сглаженном изображении 4k x 3k.
Насколько хорошо это работает, зависит от ...

...