【问题标题】:OpenMP Fortran Default ClauseOpenMP Fortran 默认子句
【发布时间】:2013-02-03 11:58:49
【问题描述】:

这种并行工作正常。

!$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

为什么我使用 Default 子句时它什么也不返回?

!$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

非常感谢!

【问题讨论】:

    标签: fortran openmp


    【解决方案1】:

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

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

    所以你不希望nrep 成为private。你仍然可以拥有default(private) shared(nrep),甚至firstprivate(nrep),尽管在这里让每个线程拥有自己的nrep 没有任何优势。

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      相关资源
      最近更新 更多