我不明白为什么这段代码:
使用ifort编译32个线程时,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
比这个快得多(约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单指令包围它们 没有带来任何加速。其他编译器可能会实现它 不同的是,如果是便携性能,最好避免使用它 要实现。