Почему моя реализация OpenMP медленнее, чем однопоточная реализация? - PullRequest
4 голосов
/ 18 февраля 2011

Я изучаю параллелизм OpenMP и попробовал свои силы в существующем у меня коде.В этом коде я попытался сделать все циклы for параллельными.Однако это, кажется, делает программу НАМНОГО медленнее, по крайней мере, в 10 раз медленнее или даже больше, чем однопоточная версия.

Вот код: http://pastebin.com/zyLzuWU2

Я также использовал pthreadsкоторая оказывается быстрее однопоточной версии.

Теперь вопрос в том, что я делаю не так в своей реализации OpenMP, которая вызывает это замедление?

Спасибо!

edit: однопоточная версия - это та, в которой нет всех # прагм

Ответы [ 3 ]

4 голосов
/ 18 февраля 2011

Одна проблема, которую я вижу с вашим кодом, состоит в том, что вы используете OpenMP для очень маленьких циклов (например, 8 или 64 итерации).Это не будет эффективным из-за накладных расходов.Если вы хотите использовать OpenMP для проблемы n-queens, посмотрите на задачи OpenMP 3.0 и параллелизм потоков для проблем с ветвлением и связью.

3 голосов
/ 18 февраля 2011

Я думаю, что ваш код слишком сложен, чтобы его можно было просмотреть здесь.Одна ошибка, которую я сразу увидел, заключается в том, что она даже не верна.В тех местах, где вы используете omp parallel for для суммирования, вы должны использовать reduction(+: yourcountervariable), чтобы правильно собрать результаты разных потоков.В противном случае один поток может перезаписать результат других.

2 голосов
/ 18 февраля 2011

Как минимум две причины:

  1. Вы выполняете только 8 итераций очень простого цикла.Ваше время выполнения будет полностью зависеть от затрат на настройку всех потоков.

  2. В некоторых местах раздел critical вызывает конфликт;все потоки будут постоянно пытаться получить доступ к критическому разделу и блокировать друг друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...