1

这种并行工作正常。

!$OMP PARALLEL Private(irep)
!$OMP DO
do irep = 1, nrep
  print *, "Using thread: ", omp_get_thread_num(), "irep: ", irep
end do
!$OMP END DO NOWAIT
!$OMP END PARALLEL

这也很好。

!$OMP PARALLEL
!$OMP DO
do irep = 1, nrep
  print *, "Using thread: ", omp_get_thread_num(), "irep: ", irep
end do
!$OMP END DO NOWAIT
!$OMP END PARALLEL

为什么当我使用默认子句时它什么也不返回?

!$OMP PARALLEL DEFAULT(Private)
!$OMP DO
do irep = 1, nrep
  print *, "Using thread: ", omp_get_thread_num(), "irep: ", irep
end do
!$OMP END DO NOWAIT
!$OMP END PARALLEL

太感谢了!

4

1 回答 1

6

让我们看一个更简单的案例:

program testprivate
use omp_lib

integer :: nrep
nrep=16

!$OMP PARALLEL DEFAULT(Private)
print *, "Thread: ", omp_get_thread_num(), "sees nrep = ", nrep
!$OMP END PARALLEL

end program testprivate

我们运行它并得到:

$ gfortran -o private private.f90 -fopenmp
$ export OMP_NUM_THREADS=8
$ ./private
 Thread:            3 sees nrep =            0
 Thread:            0 sees nrep =            0
 Thread:            1 sees nrep =        32581
 Thread:            7 sees nrep =            0
 Thread:            4 sees nrep =            0
 Thread:            5 sees nrep =            0
 Thread:            2 sees nrep =            0
 Thread:            6 sees nrep =            0

OpenMP 私有变量,无论是默认私有还是其他,在进入私有部分时都未定义。这对于在 do 循环中设置的循环索引无关紧要irep;但是如果(比如说)你的编译器在私有部分内将每个线程设置nrep为零,那么循环将永远不会执行。更糟糕的是,每个线程可能有不同的 nrep 值,任何事情都可能发生。

所以你不想nrep成为private。您仍然可以拥有default(private) shared(nrep),甚至可以拥有firstprivate(nrep),尽管在这里让每个线程都有自己的nrep.

于 2013-02-03T03:58:49.690 回答