Может ли плохой векторизованный код повлиять на масштабируемость?

Я распараллелил уже существующий код для приложений компьютерного зрения, используя OpenMP. Я думаю, что я хорошо разработал его, потому что:

  • Рабочая нагрузка хорошо сбалансирована
  • Нет механизма синхронизации/блокировки
  • Я распараллелил большинство внешних циклов
  • Все ядра используются большую часть времени (бездействующих ядер нет)
  • Работы хватит на каждый поток

Теперь приложение не масштабируется при использовании многих ядер, например. он плохо масштабируется после 15 ядер.

В коде используются внешние библиотеки (например, OpenCV и IPP), где код уже оптимизирован и векторизован, а я вручную векторизовал некоторые части кода, насколько мог. Однако, по словам Intel Advisor, код плохо векторизован, но делать особо нечего: я уже векторизовал код, где мог, и не могу улучшать внешние библиотеки.

Итак, мой вопрос: возможно ли, что векторизация является причиной того, что код в какой-то момент плохо масштабируется? Если да, то почему?


person justHelloWorld    schedule 26.05.2017    source источник
comment
Вы подсчитали, какая пропускная способность памяти используется? Если вы перегружаете шину памяти, большее количество ядер не поможет. Рефакторинг может; если ваши данные перемещаются туда и обратно в память за несколько проходов, выполнение большего количества проходов и, следовательно, меньшего количества проходов может устранить узкое место.   -  person Yakk - Adam Nevraumont    schedule 26.05.2017
comment
@Yakk Спасибо за ваш ответ, я этого не учел. Знаете ли вы, как я могу выполнить такой анализ с помощью какого-либо инструмента Intel (например, Intel Advisor/VTune Amplifier и т. д.)?   -  person justHelloWorld    schedule 26.05.2017
comment
Нет, я не знаю какого-либо простого инструмента для определения использования пропускной способности памяти. Обычно я просто вычисляю его, когда замечаю симптомы.   -  person Yakk - Adam Nevraumont    schedule 26.05.2017


Ответы (1)


В соответствии с комментариями Адама Невромона, VTune Amplifier может многое сделать для точного определения проблем с пропускной способностью памяти: https://software.intel.com/en-us/vtune-amplifier-help-memory-access-analysis.

Тем не менее, может быть полезно начать с более высокого уровня анализа, например, с просмотра горячих точек. Если выяснится, что большую часть вашего времени вы тратите на OpenCV или что-то подобное, о чем вы беспокоитесь, раннее обнаружение этого может сэкономить некоторое время по сравнению с прямым изучением узких мест в памяти.

person Aaron Altman    schedule 15.06.2019