2014-09-22 3 views
0

У меня есть код Fortran. Код содержит две петли. Я хочу распараллелить ТОЛЬКО внутренний цикл. Вот мой код:openmp parallelize for inner loop

!$OMP PARALLEL PRIVATE(i,j) 
do i=1, N 
    !$OMP PARALLEL DO 
    do j=1, M 
    ! do some calculations 
    end do 
    !$OMP END PARALLEL DO 
end do 
!$OMP END PARALLEL 

Правильно ли распараллеливание? Я не уверен, нужно ли сначала положить !$OMP PARALLEL PRIVATE(i,j)? Должен ли я опустить его и объявить только PRIVATE(i) перед вторым циклом? В любом случае, я немного смущен, объясните, что такое правильное поведение.

ответ

1

Почему именно i частный? Разве это не требуется для всех потоков? Он не должен меняться во время всего внутреннего цикла (поскольку он является счетчиком цикла внешнего). Если он объявлен приватным, он не определен в начале параллельного раздела, если не используется firstprivate.

OpenMP в Fortran отмечает, что j является счетчиком циклов параллельного цикла, поэтому он неявно закрыт. Поэтому нет необходимости объявлять его явно.

Следующая вещь, что вы должны избегать вложенного раздела OpenMP (т.е. второго !$OMP PARALLEL)

Потому что мне нравится быть явными, я бы написал как

!$OMP PARALLEL PRIVATE(j) SHARED(i) 
do i=1, N 
    !$OMP DO 
    do j=1, M 
    ! do some calculations 
    end do 
    !$OMP END DO 
end do 
!$OMP END PARALLEL 
+0

Как я новичок в OpenMP I не знали об исключении вложенных разделов OpenMP. Спасибо за отличное объяснение! – Bob

+1

Возможно, вы можете взглянуть на это [учебное пособие] (http://www.openmp.org/presentations/miguel/F95_OpenMPv1_v2.pdf) ... –

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