распараллелить внутренний цикл с помощью openmp

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

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

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

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


person Hernan    schedule 05.02.2011    source источник
comment
Пожалуйста, покажите нам код или, что еще лучше, упрощенный пример, показывающий проблему.   -  person    schedule 05.02.2011


Ответы (2)


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

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

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

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

person minjang    schedule 05.02.2011

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

person ltjax    schedule 05.02.2011
comment
Спасибо за все комментарии. Я еще раз загляну в свой код. Может ли кто-нибудь предложить хороший бесплатный профилировщик / анализатор кода для многопоточного кода? - person Hernan; 07.02.2011