Я распараллелил уже существующий код для приложений компьютерного зрения, используя OpenMP. Я думаю, что я хорошо разработал его, потому что:
- Рабочая нагрузка хорошо сбалансирована
- Нет механизма синхронизации/блокировки
- Я распараллелил большинство внешних циклов
- Все ядра используются большую часть времени (бездействующих ядер нет)
- Работы хватит на каждый поток
Теперь приложение не масштабируется при использовании многих ядер, например. он плохо масштабируется после 15 ядер.
В коде используются внешние библиотеки (например, OpenCV и IPP), где код уже оптимизирован и векторизован, а я вручную векторизовал некоторые части кода, насколько мог. Однако, по словам Intel Advisor, код плохо векторизован, но делать особо нечего: я уже векторизовал код, где мог, и не могу улучшать внешние библиотеки.
Итак, мой вопрос: возможно ли, что векторизация является причиной того, что код в какой-то момент плохо масштабируется? Если да, то почему?