Последовательный цикл внутри параллельных областей с OpenMP - PullRequest
0 голосов
/ 01 сентября 2018

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

  do a = 1,amax
    !$omp parallel do private(c)
    do b = 1,bmax
      do c = 1,cmax
        call mysubroutine(b,c)
      end do
    end do
    !$omp end parallel do
  end do

Однако это создает проблему, заключающуюся в том, что для каждой итерации цикла a потоки создаются, проходят через внутренние циклы, а затем завершаются. Я предполагаю, что это вызывает чрезмерную нагрузку, поскольку выполнение внутренних циклов не занимает много времени (~ 10^-4 s). Так что я бы хотел порождать темы только один раз. Как я могу порождать потоки до запуска цикла a при одновременном выполнении цикла a последовательно? Из-за природы кода каждая итерация цикла a должна быть завершена, прежде чем можно будет выполнить следующую. Например, ясно, что это не будет работать:

  !$omp parallel private(c)
  do a = 1,amax
    !$omp do 
    do b = 1,bmax
      do c = 1,cmax
        call mysubroutine(b,c)
      end do
    end do
    !$omp end do
  end do
  !$omp end parallel

потому что все потоки будут пытаться выполнить цикл a. Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Хороший способ утверждать, что «это вызывает чрезмерную нагрузку», - это оценивать масштабирование с использованием различного числа потоков.

1с долго, перераспределение нитей не так дорого…

0 голосов
/ 01 сентября 2018

«Например, ясно, что это не сработает»

Это не только не ясно, но и совершенно неверно. Код, который вы показываете, именно то, что вы должны делать (лучше с private(a)).

"потому что все потоки будут пытаться выполнить цикл"

Конечно, они будут, и они должны! Все они должны выполнить его, если они должны участвовать в совместном использовании во внутреннем цикле omp do! Если они не выполнят его, их просто не будет рядом с внутренним циклом.

Другое замечание: вы можете воспользоваться предложением collapse(2) для вложенного цикла omp do.

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