У меня есть три вложенных цикла. Я хочу распараллелить средний цикл следующим образом:
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
. Любая помощь приветствуется.