#c #multithreading #opencv
#c #многопоточность #opencv
Вопрос:
Я использую каскадный классификатор OpenCV для обнаружения, однако загрузка моего процессора никогда не превышает 50%, но приложение работает только со скоростью ~ 8 кадров в секунду, поэтому должно быть намного больше возможностей для улучшения. Я установил OpenCV с TBB. Моя собственная программа не использует многопоточность, это только часть OpenCV (функция detectMultiScale). Все ядра процессора загружены примерно на 40%. Я попытался установить приоритет программы в режиме реального времени, но это не помогло. Может ли быть какое-то узкое место, о котором я не знаю?
Детали сборки:
Я использую Visual Studio 2010 IDE. В настоящее время используются следующие оптимизации: Оптимизация: максимальная скорость (/ O2), расширение встроенных функций: по умолчанию, Включение встроенных функций: Да (/ Oi), предпочтение быстрому коду (/ Ot), Исключение указателей на фреймы: Да (/ Oy), Включение оптимизации с сохранением оптоволокна: Нет, оптимизация всей программы: Да (/GL). Я использую 64-разрядную версию Windows 7, построил программу в режиме выпуска как 64-разрядную.
Ответ №1:
Возможно, у вас процессор Intel с технологией hyperthreading. (2 потока на ядро), а TBB достаточно умен, чтобы использовать только один поток на ядро (обычно это лучше, чем с двумя). И операционная система сообщает о половине доступной мощности.
Редактировать
если вы хотите изменить классификатор самостоятельно, вы можете вызвать setNumThreads(4); а затем сопоставить сходства, и у вас будет 100% на ядро вместо средних 80%, как объясняется в комментариях
То, что вы видите, — это разница между маркетинговыми материалами (8 ядер !!) и правда (~ 3 ядра)
Комментарии:
1. Действительно, у меня процессор Intel с гиперпоточностью. Используя Process Explorer для проверки загрузки процессора, график выглядит следующим образом: i.imgur.com/7oy6r.jpg
2. Кажется, TBB использует 2 потока на ядро, но, как показывает ваш график, с этим хуже, чем без него. Ознакомьтесь с этой впечатляющей статьей о гиперпоточности agner.org/optimize/blog/read.php?i=6
3. Спасибо за статью. Я не смог отключить гиперпоточность в BIOS, поэтому я попытался повозиться с настройкой сходств в диспетчере задач, хотя это не помогло. Я создал OpenCV без TBB, но это снизило производительность программы. Может ли оперативная память быть узким местом? Немного не по теме, но когда я создаю ту же программу с Visual Studio 11, я получаю прирост производительности примерно на 20%.
4. Нет необходимости настраивать его. Это то, что может сделать ваш процессор, и это эквивалентно работе на 4 ядрах. Вы не можете сделать это быстрее, чем эти 40% на поток, что эквивалентно 80% на ядро — вот и все.
5. О, если вы хотите изменить классификатор самостоятельно, вы можете вызвать setNumThreads(4); а затем сопоставить сходства, и у вас будет 100% на ядро
Ответ №2:
Вам необходимо настроить параметр, который позволяет создавать OpenCV с поддержкой TBB в CMake.
Комментарии:
1. Он построен с поддержкой TBB. Все ядра загружены на ~ 40%.
2. Вы создаете в режиме выпуска (т. Е. со всеми оптимизациями)? На какой платформе вы работаете?
3. Я использую Visual Studio 2010 IDE. В настоящее время используются следующие оптимизации: Оптимизация: максимальная скорость (/ O2), расширение встроенных функций: по умолчанию, Включение встроенных функций: Да (/ Oi), предпочтение быстрому коду (/ Ot), Исключение указателей на фреймы: Да (/ Oy), Включение оптимизации с сохранением оптоволокна: Нет, оптимизация всей программы: Да (/GL). Я использую 64-разрядную версию Windows 7, построил программу в режиме выпуска как 64-разрядную.