Написал программу на Qt с использованием OpenCV под Ubuntu которая ищет положение в видео файле по фото с экрана, к примеру. Задается путь к видео, путь к изображению после обработки выдается время в секундах.
Решил оптимизировать добавив разбиение поиска на доступные ядра процессора. Каждый поток выбирает ядро, инициализирует свой VideoCapture, начинает поиск с определенной позиции и на определенное количество кадров. Все работает правильно, в моем случае все 12 ядер загружаются на сто процентов в отличии от первой версии которая загружала одно ядро.
НО!... Поиск идет примерно в 10 раз медленнее...
С чем это может быть связано?
Например, узким местом может быть чтение файла. То есть 12 потоков ломятся одновременно читать что-то с диска, там это всё дело перегружает дисковый ввод-вывод и т.д.
Сразу много всего можно улучшить: если файл не очень большой, его можно мапить в память; в идеале хорошо бы, чтобы читал один VideoCapture (это достаточно быстро) и раздавал кадры потокам на обработку, т.е. придумать свою версию consumer-producer. Опять же, что там именно с потоками и как должно быть написано -- это отдельный, очень общий вопрос. Ну и само чтение кадров как ускорять -- вторая проблема получается.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей