2014-11-20 4 views
1

Я пытаюсь распараллелить одну горячую точку моей программы на C++ с помощью OpenMP, но она не масштабируется. В то время как для 1 потока требуется 25 секунд, я достигаю 21 секунды с помощью двух потоков. Я сделал Locks & Анализ ожидания с помощью Intel VTune Amplifier, но мне это действительно не помогает. Это выглядит следующим образом:Как интерпретировать блокировки и ожидания Intel VTune Amplifier

Result of the VTune Amplifier

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

Я попытался получить больше информации из дерева сверху вниз, но это не очень полезно для меня.

enter image description here

продвинутая Точки доступа также анализы не дали мне больше информации. Как мне подойти к этой проблеме, чтобы определить проблему?

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

Большое спасибо!

Редактирование: Здесь также показана временная шкала, на которой не показаны переходы, независимо от того, как я приближаюсь. В этом случае я использовал другой тестовый файл с 8 потоками. enter image description here

+0

Почему вы не указали схему блокировок и ожиданий, которая указывает, как синхронизируются потоки? Между тем из числа ожидания и времени отжима я могу заключить, что рабочие потоки потратили много времени на ожидание работы. Ну, это вполне законно, если у вас действительно нет параллельной работы для них. Не знаю, почему упоминается MKL, вы связали MKL с вашим приложением? – Anton

+0

Я добавил график. В этом случае другой случай, потому что последний из выше не может быть открыт больше. Но есть одна и та же проблема: никаких переходов не видно. – user3572032

ответ

4
  1. Какую версию VTune вы используете? Похоже, что не самая последняя частота кадров для областей OpenMP, находящихся на вашем снимке экрана, удаляется в текущей версии. Стоит попробовать обновление до 2015 года 1, были сделаны некоторые исправления и улучшения для анализа OpenMP.
  2. Какой компилятор и среда выполнения OpenMP вы используете? Если это Intel OpenMP (и компилятор), анализ VTune будет более информативным для регионов OpenMP. Просто измените группировку в Bottom-up от «Funcion/callstack» до «OpenMP region/...» - вы найдете много интересного.
  3. Вы видите mkl_blas_dcopy, потому что вы, кажется, используете функции MKL в своем коде. mkl_blas_dcopy - это только внутренняя функция MKL. Вы можете найти фактический вызов MKL в своем коде, глядя на панель стеллажа справа, когда в нижней точке выбрана точка доступа «mkl_blas_dcopy» - вы должны увидеть цепочку вызовов до main().
  4. MKL уже распараллелен с помощью OpenMP. Возможно, вы включили вызов MKL внутри своей собственной области OpenMP. Если это так, это не оптимально - OpenMP не подходит при вложенности. Вы должны выбрать, использовать параллельную версию MKL без OpenMP или последовательную библиотеку MKL внутри параллельной области OpenMP. Вы можете управлять настройкой серийного/параллельного MKL с помощью ссылки, см. MKL Link Advisor: https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor
  5. Каждый кадр на временной шкале на снимке экрана, вероятно, является областью OpenMP от MKL. Кажется, что существует много параллельных областей короткой продолжительности, что может указывать на то, что MKL вызывается из цикла. Поэтому каждая итерация начинается, выполняется и останавливается параллельная область OpenMP. Действия Start и Stop имеют некоторые накладные расходы, которые учитывают ваше большое время ожидания. Поэтому, возможно, стоит попробовать серийную версию MKL внутри внешнего цикла OpenMP, чтобы избежать повторного входа в несколько параллельных регионов.
+0

Спасибо. Я попытаюсь расследовать ваши баллы и дать вам результаты, когда я закончу. Я использую более старую версию, потому что в нашем кластере нет более новых версий. Это Cluster Studio с icc 2014 и более старым усилителем. – user3572032

+0

Я обновил до усилителя 15, и это дает мне разные результаты. Но это имеет смысл для меня. Я узнал, что библиотека NAG вызывает MKL параллельно и может исправить эту «проблему». Я должен проверить, влияет ли это на общее время выполнения. Еще раз спасибо. – user3572032

1

Переходы показаны для объектов синхронизации. В этом случае время ожидания, скорее всего, происходит из среды OpenMP внутри библиотеки MKL. В VTune вы увидите это время как накладные расходы и время отжима в более поздних версиях.

+0

Как я могу видеть, где вызывается MKL, потому что я никогда не делаю этого явно? – user3572032

+1

Посмотрите на панель стеллажа справа, когда в нижней точке выбрана точка доступа «mkl_blas_dcopy» - вы должны иметь возможность видеть цепочку вызовов до main(). Если вы не вызываете MKL, возможно, вы вызываете другую библиотеку, которая может ссылаться на MKL. –