Ответ 1
Я немного озадачен вашим алгоритмом и не буду комментировать его... но поставить некоторые вещи в перспективу...
OpenCV - это библиотека, которая содержит много общих вещей для выполнения заданий и иногда намеренно не оптимизирована по производительности, есть компромисс с точки зрения затрат и "достаточно хороший, лучше, чем лучше".
Есть люди, которые продают оптимизированные по производительности библиотеки, реализующие некоторые функции OpenCV, иногда с тем же API.
Я не использовал его, но у OpenCV есть cv::gpu::cvtColor()
, который мог бы достичь ваших целей, исходя из того, что он реализован для демонстрации, и что у вас есть подходящий графический процессор.
Учитывая билинейную демозаизацию, менее оптимизированная, но оптимизированная реализация ЦП может работать намного быстрее, чем у OpenCV, я бы оценил выше 250 Мп/с на одном основном ядре процессора.
Теперь, чтобы уточнить путь оптимизации...
Во-первых, поскольку demosaicing - это локальная операция, понимание кэша действительно не является серьезной проблемой.
Оптимизированная по производительности реализация будет иметь разные пути кода в зависимости от размеров изображения, типа шаблона Bayer, наборов инструкций, поддерживаемых процессором (и их скоростью/задержкой), для такого простого алгоритма он станет много кода.
Существуют инструкции SIMD для выполнения перетасовки, арифметики, включая усреднение, потоковые записи памяти, которые вы найдете полезными. Обзор Intel не так уж плохо ориентироваться, и Agner Fog site также полезен для любого вида оптимизации реализации. AVX и AVX2 предоставляют несколько интересных инструкций для обработки пикселов.
Если вы больше похожи на человека 80/20 (хорошо для вас!), вы оцените работу с инструментом, например Halide, который может генерировать оптимизированный код трафарета, как бриз (по модулю кривой обучения, которая уже возвращает вас на несколько дней с 1-часовой наивной реализации или 10 минут с использованием OpenCV) и особенно обрабатывает граничные условия (границы изображения).
Вы можете получить немного больше (или взять альтернативный путь), используя встроенные функции компилятора для доступа к определенным инструкциям процессора, на данный момент ваш код теперь в 4 раза дороже (с точки зрения стоимости разработки), и, вероятно, вы получите 99% насколько ручная сборка ($$$ x4 снова).
Если вы хотите сжать последнюю каплю (обычно это не рекомендуется), вам определенно придется выполнять дни тестов, чтобы увидеть, какая последовательность инструкций может дать вам лучшую производительность.
Но также и графические процессоры... вы можете использовать встроенный графический процессор для демонстрации, он может быть немного быстрее, чем у процессора, и имеет доступ к основной памяти... конечно, вам нужно будет заботиться о предварительных настройках, выделение общих буферов. Дискретный GPU будет иметь более значительную нагрузку на передачу при этих скоростях заполнения.