Я разрабатываю программное обеспечение для обработки изображений на С++ на Intel, которое должно снова и снова запускать алгоритм бикубической интерполяции на небольших (около 1kpx) изображениях. Это занимает много времени, и я стремлюсь ускорить его. Сейчас у меня есть базовая реализация, основанная на литературе, несколько улучшенная (с точки зрения скорости) версия, которая не выполняет умножение матриц, а использует предварительно вычисленные формулы для частей интерполирующего многочлена и, наконец, фиксированный -точечная версия кода умножения матриц (на самом деле работает медленнее). У меня также есть внешняя библиотека с оптимизированной реализацией, но она все еще слишком медленная для моих нужд. Далее я рассматривал следующее:
- векторизация с использованием потоковой обработки MMX/SSE как в версиях с плавающей, так и в фиксированной запятой
- выполнение интерполяции в области Фурье с использованием свертки
- перенос работы на графический процессор с использованием OpenCL или аналогичного
Какой из этих подходов может дать наибольший прирост производительности? Не могли бы вы предложить другой? Спасибо.