用于可分配数组的Openmp并行工作共享

时间:2016-03-20 15:06:36

标签: fortran openmp allocatable-array

我希望在Fortran 90中对数组进行元素计算,同时将我的代码与openmp并行化。我现在有以下代码:

program test
implicit none

integer,parameter :: n=50
integer :: i
integer(8) :: t1,t2,freq
real(8) :: seq(n),r(n,n,n,n)
real(8),dimension(n,n,n,n) :: x

call system_clock(COUNT_RATE=freq)

seq=[(i,i=1,n)]
x=spread(spread(spread(seq,2,n),3,n),4,n)

call system_clock(t1)

!$omp parallel workshare
! do some array calculation
r=atan(exp(-x))
!$omp end parallel workshare

call system_clock(t2)

print*, sum(r)
print '(f6.3)',(t2-t1)/real(freq)

end program test

我现在想用可分配的数组替换静态数组x和r,所以我输入:

real(8),dimension(:,:,:,:),allocatable :: x,r
allocate(x(n,n,n,n))
allocate(r(n,n,n,n))

但该程序串行运行且没有错误,编译器没有考虑“!$ omp parallel workshare”这一行。

在这种情况下,我应该使用哪些选项进行并行化?我已尝试使用omp parallel do循环,但速度要慢得多。

我在windows上用gfortran 5.1.0编译我的代码:

gfortran -ffree-form test.f -o main.exe -O3 -fopenmp -fno-automatic

1 个答案:

答案 0 :(得分:4)

我之前在gfortran遇到过这个问题。解决方案是以下列形式指定数组:

!$omp parallel workshare
! do some array calculation
r(:,:,:,:) = atan(exp(-x))
!$omp end parallel workshare

这是reference