带有fortran的OpenMp:为什么多重DO循环比工作共享更快

时间:2015-02-25 14:15:23

标签: parallel-processing fortran openmp

我不明白为什么这段代码:

double precision :: array(200,200,100)
double precision :: array2(200,200,100)

!$OMP BARRIER
!$OMP DO SCHEDULE(static)
do z=1,100
   do y=1,200
      do x=1,200
         array2(x,y,z)=array(x,y,z)
      enddo
   enddo
enddo
!$OMP END DO NOWAIT
!$OMP BARRIER
使用ifort编译32个线程时,

比这个快得多(约25%):

double precision :: array(200,200,100)
double precision :: array2(200,200,100)

!$OMP BARRIER
!$OMP WORKSHARE
array2=array
!$OMP END WORKSHARE NOWAIT
!$OMP BARRIER

这两个代码假设完全相同。

编辑:oups,我在重命名我的数组时犯了一个错误,抱歉

Edit2:抱歉,在发布之前我没有足够的搜索。我在这里找到了答案 Parallelizing fortran 2008 `do concurrent` systematically, possibly with openmp

  

目前不鼓励使用OpenMP workshare指令。它   事实证明,至少英特尔Fortran编译器和GCC序列化   OpenMP中的FORALL语句和构造共享指令   在编译期间用OpenMP单指令包围它们   没有带来任何加速。其他编译器可能会实现它   不同的是,如果是便携性能,最好避免使用它   要实现。

0 个答案:

没有答案