在 Fortran 中,给定数组 A(1000000) 和 B(1000000),计算总和只需编写:
C = A + B
但是,当我想实现 OpenMP 时,我必须编写一个显式循环:
!$OMP PARALLEL DO
DO I = 1, 1000000
C(I) = A(I) + B(I)
END DO
!$OMP END PARALLEL DO
有一个更好的方法吗?我知道有-parallel编译器标志,但它提供的性能较低。
在 Fortran 中,给定数组 A(1000000) 和 B(1000000),计算总和只需编写:
C = A + B
但是,当我想实现 OpenMP 时,我必须编写一个显式循环:
!$OMP PARALLEL DO
DO I = 1, 1000000
C(I) = A(I) + B(I)
END DO
!$OMP END PARALLEL DO
有一个更好的方法吗?我知道有-parallel编译器标志,但它提供的性能较低。
作为记录,您可以尝试在数组操作语法周围放置一个 OpenMP 工作共享区域:
!$omp workshare
C=A+B
不要忘记在启用 OpenMP 的情况下构建(英特尔编译器的 -openmp)并设置OMP_NUM_THREADS.
不,没有更好的方法来做到这一点。
WORKSHARE比显式循环并行更难实现。众所周知,编译器可以将WORKSHARE其映射到SINGLE. 这是正确的,但显然没有提供性能优势。
当编译器支持WORKSHARE时,他们可能会选择性地这样做,例如Intel Fortran 15,这意味着取决于它可能会导致混合结果。
即使编译器做得很好,在一般的并行计算中,你会发现显式并行化会获胜,因为用户需要预先做出好的设计选择,而比人类智能得多的编译器不必这样做做出重要的决定。