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