Я пытаюсь распараллелить одну точку моей программы на C ++ с OpenMP, но она не масштабируется. В то время как это требует 25 секунд для 1 потока, я достигаю только 21 секунды для 2 потоков. Я сделал Замки & Ждите анализа с Intel VTune Amplifier, но это не очень мне помогает. Это выглядит как:
Я особенно не понимаю, откуда берется mkl_blas_dcopy и как он его вызывает (даже если я удалю свой параллельный регион, у меня будет этот вызов и второй поток на временной шкале).
Я пытался получить больше информации из дерева сверху вниз, но это не очень полезно для меня.
Расширенный анализ горячих точек также не дал мне больше информации.
Как мне подойти к этой проблеме, чтобы определить проблему?
Дополнительная информация: Раньше у меня было намного худшее общее время выполнения, но я много оптимизировал последовательный код и мог повысить производительность, но после этого мой код больше не масштабировался.
Спасибо заранее!
Изменить: Здесь также временная шкала, где не отображаются переходы, независимо от того, как близко я увеличить. В этом случае я использовал другой тестовый случай с 8 потоками.
Переходы показаны для объектов синхронизации. В этом случае время ожидания, скорее всего, приходит из среды выполнения OpenMP внутри библиотеки MKL. В VTune вы будете видеть это время как время загрузки и вращения, в более поздних версиях.