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