OpenMP параллельный рабочий ресурс для выделяемого массива

Я хочу сделать некоторые поэтапные вычисления для массивов в 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 с петлями, но это намного медленнее.

Я компилирую свой код с помощью gfortran 5.1.0 для Windows:

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

1 ответ

Решение

Я сталкивался с этой проблемой в gfortran до. Решение состоит в том, чтобы указать массив в следующей форме:

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

Вот ссылка.

Другие вопросы по тегам