用于可分配数组的 Openmp 并行工作共享
Openmp parallel workshare for 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
我之前在 gfortran
遇到过这个问题。解决办法是指定数组如下形式:
!$omp parallel workshare
! do some array calculation
r(:,:,:,:) = atan(exp(-x))
!$omp end parallel workshare
这里是reference。
我想在 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
我之前在 gfortran
遇到过这个问题。解决办法是指定数组如下形式:
!$omp parallel workshare
! do some array calculation
r(:,:,:,:) = atan(exp(-x))
!$omp end parallel workshare
这里是reference。