распараллелить внутренний цикл, используя openmp - PullRequest
6 голосов
/ 05 февраля 2011

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

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

Есть ли способ создать нити вне внешних петель, но просто использовать их в самой внутренней петле?

Заранее спасибо

Ответы [ 2 ]

5 голосов
/ 05 февраля 2011

OpenMP должен использовать пул потоков, поэтому вы не будете воссоздавать потоки при каждом выполнении цикла.Строго говоря, это может зависеть от используемой вами реализации OpenMP (я знаю, что компилятор GNU использует пул).Я предлагаю вам поискать другие распространенные проблемы, такие как ложный обмен.

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

К сожалению, современные многоядерные компьютерные системы не годятся для такого мелкозернистого параллелизма внутри цикла.Это не из-за проблемы создания / разветвления потока.Как указал Itjax, практически все реализации OpenMP используют пулы потоков, т. Е. Они предварительно создают несколько потоков, а потоки запаркованы.Таким образом, на самом деле нет никаких накладных расходов на создание потоков.

Однако проблемы таких распараллеливающих внутренних циклов заключаются в следующих двух издержках:

  • Распределение заданий / задач в потоки: даже еслинам не нужно физически создавать потоки, по крайней мере, мы должны назначать задания (= создавать логические задачи) потокам, которые в основном требуют синхронизации.
  • Присоединение к потокам: после всех потоков в команде эти потоки должны бытьприсоединился (если только не используется директива OpenMP сейчас).Это обычно реализуется как барьерная операция, которая также является очень интенсивной синхронизацией.

Следовательно, следует минимизировать фактическое количество назначений / присоединений потоков.Вы можете уменьшить такие накладные расходы, увеличив объем работы внутреннего цикла на один вызов.Это может быть сделано с помощью некоторых изменений кода, таких как развертывание цикла.

...