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
Вот ссылка.