В настоящее время я работаю над распараллеливанием программы на C ++, чтобы повысить ее производительность в многоядерных системах. Используя OpenMP и учитывая проблемы (синхронизация потоков, доступ к данным и т. Д.), Мы наконец нашли способ сделать всю программу параллельной, но повышение производительности не является подавляющим.
Используя Intel VTune Amplifier, я выполнил поиск горячей точки и обнаружил, что практически при каждом вызове функции, который должен выполняться параллельно, «start_thread clone» из libgomp.so отнимает больше времени, чем фактическое выполнение функции:
Это действительно неожиданно, так как я проверил, что в текущих реализациях OpenMP не должно быть практически никаких штрафов за переключение из параллельных и последовательных областей. В соответствии с это обсуждение:
Поток запускается при запуске вашей программы (или в первый раз,
в зависимости от реализации). Приостановите свою программу где-нибудь еще, и вы
обратите внимание на темы все еще там
Я сделал это, остановил программу в отладчике, до первой параллельной области был только один поток, после чего, где бы я ни остановился (параллельная или последовательная область), было несколько потоков. Таким образом, я был убежден, что не должно быть никаких издержек от «повторного создания» новых потоков каждый раз.
Теперь VTune говорит мне по-другому, насколько я могу понять измерения. Может ли кто-нибудь помочь мне здесь?
Пожалуйста, скачайте соответствующий пакет отладки для libgomp, содержащий символы отладки для этой библиотеки — VTune сможет лучше классифицировать время процессора. Присутствие libgomp в горячей точке может быть вызвано Spin Locks в результате неправильного разделения работы.
Также обратите внимание, что время на скриншоте не означает, что «клон start_thread» занял 11 секунд — это означает, что точка доступа (неразрешенная функция) заняла 11 секунд, вызываясь из start_thread через регион calcGrowthStep.