Fortran 数组在 OpenMP 中平行的相同形状和大小
fortran arrays same shape and size parallel in OpenMP
我想问问 openMP 是否能够使用 simple 符号并行化具有相同形状和大小的 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 并行化?
正如 评论的那样,问题的答案是用 workshare 子句将其包装起来:
!$OMP WORKSHARE
d = a + b * 1.1
!$OMP END WORKSHARE
查找更多信息here
我想问问 openMP 是否能够使用 simple 符号并行化具有相同形状和大小的 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 并行化?
正如
!$OMP WORKSHARE
d = a + b * 1.1
!$OMP END WORKSHARE
查找更多信息here