首页 > 解决方案 > 在 OpenMP 中并行排列相同形状和大小的 fortran 数组

问题描述

我想问一下openMP是否能够使用简单的符号并行化具有相同形状和大小的fortran数组。我做了一些研究,但我无法找到或弄清楚这是否可能。

我将以下形式称为简单符号:

a = b + c * 1.1

在下面找到一个完整的例子:

PROGRAM Parallel_Hello_World

USE OMP_LIB

implicit none

integer, parameter :: ILEN = 1000
integer :: a(ILEN,ILEN), b(ILEN,ILEN), c(ILEN,ILEN), d(ILEN,ILEN)
integer :: i, j

a = 1
b = 2

!$OMP PARALLEL SHARED(a, b, c, d)

    !$OMP DO
    DO i=1,ILEN
      DO j=1, ILEN
        c(j,i) = a(j,i) + b(j,i) * 1.1
      ENDDO
    END DO
    !$OMP END DO

    # is this loop parallel?
    d = a + b * 1.1

!$OMP END PARALLEL
write (*,*) "Total C: ", c(1:5, 1)
write (*,*) "Total D: ", d(1:5, 1)
write (*,*) "C same D? ", all(c == d)

END

d循环是否使用当前符号与 openMP 并行化?

标签: fortranopenmpgfortran

解决方案


正如@Gilles所评论的,问题的答案是用workshare 子句包装

  !$OMP WORKSHARE
  d = a + b * 1.1
  !$OMP END WORKSHARE

在此处查找更多信息


推荐阅读