Multithreading OpenMP:并行区域内的条件循环

Multithreading OpenMP:并行区域内的条件循环,multithreading,if-statement,fortran,openmp,Multithreading,If Statement,Fortran,Openmp,我有一组循环的severk,其中一个循环只有在满足某个条件时才执行 如何确保只有一个线程(可能使用SINGLE)执行if语句,但所有线程都可用于do !$omp parallel !$omp do do i=0,512 something to do end do !$omp end do nowait if (condition_var) then !$omp do do i=0,512 only do sometimes end do

我有一组循环的severk,其中一个循环只有在满足某个条件时才执行

如何确保只有一个线程(可能使用
SINGLE
)执行if语句,但所有线程都可用于
do

!$omp parallel
!$omp do
do i=0,512
    something to do
end do
!$omp end do nowait

if (condition_var) then
    !$omp do
    do i=0,512
         only do sometimes
    end do
    !$omp end do
fi
!$omp end parallel

您不必确保只有一个线程计算if条件,只要该条件在团队中的线程之间给出相同的结果。更明确地说:

!$omp parallel
!$omp do
do i=0,512
    something to do
end do
!$omp end do
! Synchronize here to ensure shared variables 
! will not be changed while evaluating the if condition

if (condition_var) then
! All threads evaluate the if condition and either enter
! the block or skip it
    !$omp do
    do i=0,512
         only do sometimes
    end do
    !$omp end do
fi
!$omp end parallel

如果条件在并行区域内没有更改,则第一个循环后是否需要同步?@John No。您必须确保的唯一一点是,所有线程要么计算
if
条件为真,要么计算它为假。