2015-05-31 5 views
0

Я работаю в Fortran. Моя цель состоит в том, чтобы распараллелить с OpenMP программы такого рода:Fortran OpenMP: создание потоков только один раз

do t=1, t_fin (sequential) 
    a sequence of do loops (not sequential) 
end do 

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

!$OMP PARALLEL 

!$OMP SECTIONS 
!$OMP CRITICAL 
do t=1, t_fin 
    sequence of OMP do 
end do 
!$OMP END CRITICAL 
!$OMP END PARALLEL 

Я пробовал таким образом, но работает, как если бы это была только одна тема. Я полагаю, это зависит от того, что существует внешний критический раздел, который включает в себя omp do. Тем не менее, я хотел бы выполнить внутренний omp do с несколькими потоками. Есть ли способ получить это?

+1

Я не уверен, каков ваш вопрос на самом деле. Почему вы не распараллеливаете свой цикл, используя одну директиву 'omp parallel do'? Почему вы используете 'section'? Почему вы критически настроены? Вы знаете, что в критический раздел за один раз разрешен только один поток, верно? Ваш код не имеет смысла ... –

ответ

2

Если я правильно понял ваш вопрос, вы хотите избежать создания потоков в каждой итерации внешнего цикла. Этого можно добиться, если принять директиву OMP PARALLEL вне цикла и оставить остальные операторы внутри цикла. Затем я вижу две схемы распараллеливания.

Вы можете либо распараллелить внутренние циклы:

!$OMP PARALLEL 
do t=1, t_fin (sequential) 
    !$OMP DO 
    first loop 
    !$OMP END DO 

    !$OMP DO 
    second loop 
    !$OMP END DO 

    !... 
end do 
!$OMP END PARALLEL 

или использовать секции для запуска петли параллельно (если они независимы друг от друга):

!$OMP PARALLEL 
do t=1, t_fin (sequential) 
    !$OMP SECTIONS 

    !$OMP SECTION 
    first loop 
    !$OMP END SECTION 

    !$OMP SECTION 
    second loop 
    !$OMP END SECTION 

    !... 
    !$OMP END SECTIONS 
end do 
!$OMP END PARALLEL 

В обеих версиях, потоки создаются вне цикла.

Смежные вопросы