Клон start_thread занимает большую часть времени в параллельной программе - плохое распараллеливание или неверный отчет?

В настоящее время я работаю над распараллеливанием программы на C++, чтобы повысить ее производительность на многоядерных системах. Используя OpenMP и учитывая проблемы (синхронизация потоков, доступ к данным и т. д.), мы, наконец, нашли способ сделать всю программу параллельной, но улучшение производительности не является ошеломляющим.

Используя Intel VTune Amplifier, я провел поиск горячих точек и обнаружил, что почти в каждом вызове функции, который должен выполняться параллельно, «клонирование start_thread» из libgomp.so занимает больше времени, чем фактическое выполнение функции:

Изображение результата Intel VTune

Это действительно неожиданно, так как я проверил, что в текущих реализациях OpenMP не должно быть почти никакого штрафа за переключение с параллельных и последовательных регионов. Согласно это обсуждение:

Поток запускается при запуске вашей программы (или в первый раз, в зависимости от реализации). Приостановите свою программу в любом другом месте, и вы заметите, что потоки все еще там.

Я так и сделал, остановил программу в отладчике, до первого параллельного региона был только один поток, потом, где бы я ни остановился (параллельный или последовательный регион), было несколько потоков. Поэтому я был убежден, что не должно быть накладных расходов на «повторное создание» новых потоков каждый раз.

Сейчас мне VTune говорит по другому, насколько я могу понять измерения. Может ли кто-нибудь помочь мне здесь?


person leosh    schedule 08.01.2015    source источник
comment
Вы включаете отладочную информацию для всех ваших пользовательских модулей (используя -g)? И возможно ли использовать реализацию Intel OpenMP? В идеале вам нужно сделать обе вещи, чтобы сделать профилирование параллельных программ в VTune наиболее значимым.   -  person zam    schedule 11.01.2015


Ответы (1)


Пожалуйста, загрузите соответствующий отладочный пакет для libgomp, содержащий символы отладки для этой библиотеки - VTune сможет лучше классифицировать процессорное время. Присутствие libgomp в хотспоте может быть вызвано спин-блокировками в результате плохого разделения работы.

Также обратите внимание, что время на снимке экрана не означает, что «клонирование start_thread» заняло 11 секунд — это означает, что горячая точка (неразрешенная функция) вызвала 11 секунд из start_thread через регион calcGrowthStep.

person Vital    schedule 12.01.2015